Tengo un problema para convertir un objeto stdClass a la matriz.
He intentado de esta manera:

return (array) $booking;

o

return (array) json_decode($booking,true);

o

return (array) json_decode($booking);

La matriz antes de que el reparto se completa con un registro, después de mi trate de lanzar está vacía.
Cómo cast /convertir sin eliminar sus filas?

de la matriz antes de reparto:

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } } 

después de fundido se vacía NULL si intento hacer un var_dump($booking);

También he probado esta función, pero siempre vacía:

public function objectToArray($d) {
        if (is_object($d)) {
            //Gets the properties of the given object
            //with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            //Return array
            return $d;
        }
    }
  • php.net/var_dumpphp.net/var_export – antes de return. Y ejecución de json_decode en una matriz parece bastante desesperado para mí, probablemente demasiado tiempo sentado frente a la computadora y ahora es el momento para tomar un descanso?
  • Solo para aclarar: var_dump($booking); salidas NULL?
  • después de emitidos sí, y si trato de imprimir esta: $reserva[0][‘id’] retorno de mí que no existen
  • Usted podría estar interesado en leer: Cómo llegar útil mensajes de error en PHP? – de todos Modos, yo estaba pidiendo var_dump() antes de la colada. No vuelva a utilizar el mismo nombre de variable por cierto. si $booking fue algo antes de la colada, que todavía debe ser que algo antes de la colada y no algo diferente después. Difieren entre la entrada y el procesamiento de las variables de lo contrario corre en problemas que no entiende más lo que haces allí.
  • El acortamiento de la pregunta (como la eliminación de la función personalizada de código) podría ser útil para ver la aceptación respuesta sin tener que desplazarse hacia abajo
  • En el caso general, creo que esto no es posible. Considerar si los objetos tienen ciclos, eliminar la referencia de esto en las matrices, va a terminar en un bucle infinito… Sólo quería apuntar este problema. Para otros escenarios, otras respuestas son válidos…

9 Comentarios

  1. 389

    La perezoso one-liner método

    Usted puede hacer esto en un forro con el JSON métodos, si usted está dispuesto a perder un poco de rendimiento (a pesar de que algunos han informado de que ser más rápido que la iteración a través de los objetos de forma recursiva – lo más probable es debido a que PHP es lento en las llamadas a las funciones). «Pero yo ya hice este» que usted dice. No exactamente, se utiliza json_decode en la matriz, pero la necesidad de codificar con json_encode primera.

    Requisitos

    La json_encode y json_decode métodos. Estos son automáticamente incluidos en PHP 5.2.0 y de seguridad. Si utiliza una versión anterior también hay una PECL biblioteca (que dijo, en ese caso usted debe realmente actualizar su instalación de PHP. Soporte para 5.1 detenido en 2006.)


    La conversión de un array/stdClass -> stdClass

    $stdClass = json_decode(json_encode($booking));

    La conversión de un array/stdClass -> array

    El manual especifica el segundo argumento de json_decode como:

    assoc

    Cuando TRUE, devuelve los objetos se convierten en matrices asociativas.

    Por lo tanto la siguiente línea de convertir el objeto en su totalidad en una matriz:

    $array = json_decode(json_encode($booking), true);
    • Si (array) $booking; en un var_dump es NULL (como está escrito por OP), supongo que lo que este código va a volver?
    • Parece que no es NULL después de la fundición como una matriz. Creo OP significa que es NULL después de usar json_decode($array) que tiene sentido por el manual. se devuelve NULL si el json que no puede ser decodificado
    • En la pregunta se describen tres formas. OP dadas las NULL información para todas las tres formas.
    • No sé por qué, pero funciona o_0 gracias +1
    • La razón por la que no funcionó antes estaba antes de que la estaban usando json_decode() en una matriz. json_decode debe ser utilizado en una cadena JSON. Por lo tanto, si queremos codificar como una cadena JSON primera (json_encode) y entonces decodificación (usando nuestra cadena JSON), entonces funciona bien.
    • He aceptado la otra pregunta porque creo que es mejor, pero la solución es bien muchas gracias
    • No hay problema – puede que (leer: si) ser más rápido de cualquier manera, y esto es, como se dijo, sólo los perezosos solución.
    • Gracias por explicar por qué es mejor y he de hacer un punto de referencia y es mucho más rápido que los otros métodos. Gracias @h2ooooooo
    • Muchas gracias por este post. Es muy útil.
    • Tiene todo el mundo se olvidó de que usted va a perder su tipos que no están definidos en JSON spec (fechas por ejemplo)? Usted necesitará tener una reviver, a continuación, si se utiliza este enfoque. Esto sólo es bueno si usted tiene tipos básicos tales como números, cadenas de texto y valores booleanos.
    • Esta respuesta es exactamente la razón por la que he leído de StackOverflow. Gracias!
    • Gran respuesta, he estado usando sólo json_decode($stdClass, true) 😉
    • esta respuesta fue muy útil en la explicación de algunas cosas que yo no sé, pero la codificación antes de que no siempre es necesario, de hecho a veces se convierte los datos en una cadena. Recientemente, la solución para mí era sólo json_decode($stdClass, true);
    • La línea de trabajo que para mí fue json_decode(json_encode($reserva), true);
    • Si usted decodificar los datos binarios no funciona creo

  2. 66

    utilice esta función para obtener un estándar de la matriz del tipo que usted está después…

    return get_object_vars($booking);
    • Esto no es recursiva
    • bueno para un elemento de la matriz
  3. 17

    Ya que es un array antes de lanzarla, de fundición no tiene sentido.

    Es posible que desee un recursiva de fundición, el cual se verá algo como esto:

    function arrayCastRecursive($array)
    {
        if (is_array($array)) {
            foreach ($array as $key => $value) {
                if (is_array($value)) {
                    $array[$key] = arrayCastRecursive($value);
                }
                if ($value instanceof stdClass) {
                    $array[$key] = arrayCastRecursive((array)$value);
                }
            }
        }
        if ($array instanceof stdClass) {
            return arrayCastRecursive((array)$array);
        }
        return $array;
    }

    Uso:

    $obj = new stdClass;
    $obj->aaa = 'asdf';
    $obj->bbb = 'adsf43';
    $arr = array('asdf', array($obj, 3));
    
    var_dump($arr);
    $arr = arrayCastRecursive($arr);
    var_dump($arr);

    Resultado antes:

    array
        0 => string 'asdf' (length = 4)
      1 => 
        array
            0 =>
            object(stdClass)[1]
              public 'aaa' => string 'asdf' (length = 4)
              public 'bbb' => string 'adsf43' (length = 6)
          1 => int 3

    Resultado después de:

    array
        0 => string 'asdf' (length = 4)
      1 => 
        array
            0 =>
            array
              'aaa' => string 'asdf' (length = 4)
              'bbb' => string 'adsf43' (length = 6)
          1 => int 3

    Nota:

    Probado y funcionando con complejo de matrices donde un stdClass object puede contener otros stdClass objetos.

    • Gran. Ahora trabaja para stdClass objetos que contienen stdClass objetos 🙂
  4. 13

    Por favor usar la siguiente función php para convertir php stdClass a la matriz

    get_object_vars($data)
    • Tenga en cuenta que esta función no recursiva. Se refieren a la respuesta de la Carlo Fontanos para una solución recursiva.
  5. 4

    Utilizar el construido en la funcionalidad de conversión de tipo, simplemente escriba

    $realArray = (array)$stdClass;
    • Yo prefiero esto a través de json_decode/codificar, mucho más limpio +1
    • Este método es más limpio, sin embargo, también es no recursivo, y funciona de la misma como la get_object_vars(). Mientras que el json_decode/codificar método tiene la sensación de un hack, funciona de forma recursiva.
  6. 3

    Sólo busqué en google, y se encontró aquí una práctica función que es útil para la conversión de stdClass object array de forma recursiva.

    <?php
    function object_to_array($object) {
     if (is_object($object)) {
      return array_map(__FUNCTION__, get_object_vars($object));
     } else if (is_array($object)) {
      return array_map(__FUNCTION__, $object);
     } else {
      return $object;
     }
    }
    ?>

    EDITAR: he actualizado esta respuesta con el contenido de origen vinculado (que también es cambiado ahora), gracias a mason81 por sugerirme.

    • La próxima vez por favor incluya el contenido relevante desde el origen vinculado. El vínculo que siempre ha cambiado y es ahora irrelevante e inútil.
    • Esto es lo que estaba buscando, muchas Gracias.
  7. 0

    Aquí es una versión de Carlo respuesta que puede ser utilizado en una clase:

    class Formatter
    {
        public function objectToArray($data)
        {
            if (is_object($data)) {
                $data = get_object_vars($data);
            }
    
            if (is_array($data)) {
                return array_map(array($this, 'objectToArray'), $data);
            }
    
            return $data;
        }
    }
  8. 0

    El código siguiente leer todos los correos electrónicos & imprimir el Sujeto, Cuerpo & Fecha.

    <?php
      $imap=imap_open("Mailbox","Email Address","Password");
      if($imap){$fixMessages=1+imap_num_msg($imap);  //Check no.of.msgs
    /*
    By adding 1 to "imap_num_msg($imap)" & starting at $count=1
       the "Start" & "End" non-messages are ignored
    */
        for ($count=1; $count<$fixMessages; $count++){
          $objectOverview=imap_fetch_overview($imap,$count,0);
    print '<br>$objectOverview: '; print_r($objectOverview);
    print '<br>objectSubject ='.($objectOverview[0]->subject));
    print '<br>objectDate ='.($objectOverview[0]->date);
          $bodyMessage=imap_fetchbody($imap,$count,1);
    print '<br>bodyMessage ='.$bodyMessage.'<br><br>';
        }  //for ($count=1; $count<$fixMessages; $count++)
      }  //if($imap)
      imap_close($imap);
    ?>

    Esta salida es el siguiente:

    $objectOverview: Array ( [0] => stdClass Object ( [subject] => Hello
    [from] => Email Address [to] => Email Address [date] => Sun, 16 Jul 2017 20:23:18 +0100
    [message_id] =>  [size] => 741 [uid] => 2 [msgno] => 2 [recent] => 0 [flagged] => 0 
    [answered] => 0 [deleted] => 0 [seen] => 1 [draft] => 0 [udate] => 1500232998 ) )
    objectSubject =Hello
    objectDate =Sun, 16 Jul 2017 20:23:18 +0100
    bodyMessage =Test 

    De haber luchado con diversas sugerencias que he utilizado juicio & error para llegar a esta solución. Espero que ayude.

Dejar respuesta

Please enter your comment!
Please enter your name here