¿Cómo convierto un objeto en una matriz?

204
<?php
   print_r($response->response->docs);
?>

Produce lo siguiente:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)

¿Cómo puedo convertir este objeto en una matriz? Me gustaría mostrar lo siguiente:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)

es posible?

zahir hussain
fuente

Respuestas:

133

Debe mirar get_object_vars , ya que sus propiedades se declaran privadas, debe llamar a esto dentro de la clase y devolver sus resultados.

Tenga cuidado, para tipos de datos primitivos como cadenas funcionará muy bien, pero no sé cómo se comporta con los objetos anidados.

en tu caso tienes que hacer algo como;

<?php
   print_r(get_object_vars($response->response->docs));
?>
Benoit
fuente
385

Matrices unidimensionales

Para convertir matrices de una sola dimensión, puede emitir usando (array)o hay get_object_vars, que Benoit mencionó en su respuesta .

// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

Funcionan ligeramente diferentes el uno del otro. Por ejemplo, get_object_varsdevolverá una matriz con solo propiedades de acceso público a menos que se llame desde dentro del alcance del objeto que está pasando (es decir, en una función miembro del objeto). (array), por otro lado, se lanzará a una matriz con todos los miembros públicos, privados y protegidos intactos en la matriz, aunque todos públicos ahora, por supuesto.

Matrices multidimensionales

Un método algo sucio es utilizar las funciones JSON nativas de PHP> = 5.2 para codificar a JSON y luego decodificar de nuevo a una matriz. Sin embargo, esto no incluirá miembros privados y protegidos, y no es adecuado para objetos que contienen datos que no pueden codificarse con JSON (como datos binarios).

// The second parameter of json_decode forces parsing into an associative array
$array = json_decode(json_encode($object), true);

Alternativamente, la siguiente función convertirá de un objeto a una matriz que incluye miembros privados y protegidos, tomados de aquí y modificados para usar la conversión:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}
Andy E
fuente
55
La primera solución no manejó las mutlidimensiones, pero la segunda solución funcionó muy bien.
sbuck
1
La segunda solución me recordó que hay un segundo parámetro para json_decode () que olvidé ... gracias.
Tyler
1
Me pregunto por qué esta respuesta está obteniendo tantos votos. Ambas soluciones son menos claras y bonitas que get_object_vars
RJD22
3
@ RJD22: He actualizado mi respuesta para que sea más un recurso 'de facto', espero que ahora lo consideres digno de sus votos positivos. ;-) Tenga en cuenta para todos los demás que la "segunda solución" a la que se refieren los comentarios aquí es la solución JSON, que fue la segunda en mi primera respuesta.
Andy E
¡INCREÍBLE! ¡Me sorprendió una solución y me desplacé hacia abajo para encontrar esto!
Eozzy
44

Puede convertir rápidamente objetos profundamente anidados en matrices asociativas confiando en el comportamiento de las funciones de codificación / decodificación JSON:

$array = json_decode(json_encode($response->response->docs), true);
Mufaddal
fuente
2
Esta es la respuesta más simple a este problema. Lo usé y funcionó increíble. Gracias
Dustin Fraker
77
Solo una nota: esto funcionará en caso de que su matriz contenga datos válidos UTF8. Si su matriz contiene alguna otra codificación, digamos Win1250, fallará, ya que json_encode fallará (php 5.3)
Radek
¿Cómo convertirlo de nuevo a un objeto?
Pmpr
@Trix usa json nuevamente json_decode (json_encode ($ array), FALSE); Esto también (recursivamente) convierte todas sus sub matrices en objetos,
Mufaddal
Desearía poder aumentar esto más de una vez.
JohnFF
34

Cuidado:

$array = (array) $object;

realiza una conversión superficial ($ object-> innerObject = new stdClass () sigue siendo un objeto) y la conversión de ida y vuelta con json funciona, pero no es una buena idea si el rendimiento es un problema.

Si necesita que todos los objetos se conviertan en matrices asociativas, aquí hay una mejor manera de hacerlo (código extraído de no recuerdo dónde):

function toArray($obj)
{
    if (is_object($obj)) $obj = (array)$obj;
    if (is_array($obj)) {
        $new = array();
        foreach ($obj as $key => $val) {
            $new[$key] = toArray($val);
        }
    } else {
        $new = $obj;
    }

    return $new;
}
Sergio
fuente
No puedo leer la matriz resultante de la conversión de un objeto: codepad.viper-7.com/AkX5pq ¿Tiene alguna explicación al respecto?
Damien el
1
Me gusta más esta respuesta. La función recursiva de Andy E esencialmente hace lo mismo, pero me parece más fácil de entender.
HartleySan
20
$array = json_decode(json_encode($object), true);

Intenté varias formas de hacer foreachun objeto y ESTA es realmente la solución más fácil y genial que he visto. Solo una línea :)

m3nda
fuente
Funciona perfecto solo con atributos de objetos públicos. No considera los privados.
Limon
Aquí hay una explicación sobre el uso de la función JsonSerialize, pero no es una solución de línea y leí que no es una buena práctica :( stackoverflow.com/questions/7005860/… . Gracias por el consejo.
m3nda
¿Cómo convertirlo de nuevo a un objeto?
Pmpr
18

Versión simple:

$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();

Versión recursiva actualizada:

class RecursiveArrayObject extends ArrayObject
{
    function getArrayCopy()
    {
        $resultArray = parent::getArrayCopy();
        foreach($resultArray as $key => $val) {
            if (!is_object($val)) {
                continue;
            }
            $o = new RecursiveArrayObject($val);
            $resultArray[$key] = $o->getArrayCopy();
        }
        return $resultArray;
    }
}

$arrayObject = new RecursiveArrayObject($object);
$array = $arrayObject->getArrayCopy();
Estigio
fuente
2

Prueba esto:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>
kunal
fuente
2

Tuve el mismo problema y lo resolví con get_object_vars mencionados anteriormente.

Además, tuve que convertir mi objeto con json_decode y tuve que iterar la matriz con el ciclo "for" de la vieja escuela (en lugar de para cada uno).

Lucas Bacciotti
fuente
0

También puede usar el método array_values ​​() de php

Rikin Adhyapak
fuente
2
No puedes "Array_values ​​() espera que el parámetro 1 sea matriz, objeto dado".
manatwork
0

Me encontré con un problema con la respuesta de Andy Earnshaw porque había factorizado esta función en una clase separada dentro de mi aplicación, "HelperFunctions", lo que significaba que la llamada recursiva a objectToArray () había fallado.

Lo superé especificando el nombre de la clase dentro de la llamada array_map así:

public function objectToArray($object) {
    if (!is_object($object) && !is_array($object))
        return $object;
    return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}

Hubiera escrito esto en los comentarios, pero todavía no tengo suficiente reputación.

leon.clements
fuente
-2
//My Function is worked. Hope help full for you :)
      $input = [
            '1' => (object) [1,2,3],
            '2' => (object) [4,5,6,
                (object) [6,7,8,
                [9, 10, 11,
                    (object) [12, 13, 14]]]
            ],
            '3' =>[15, 16, (object)[17, 18]]
        ];

        echo "<pre>";
        var_dump($input);
        var_dump(toAnArray($input));

      public function toAnArray(&$input) {

        if (is_object($input)) {
            $input = get_object_vars($input);
        }
        foreach ($input as &$item) {
            if (is_object($item) || is_array($item)) {
                if (is_object($item)) {
                    $item = get_object_vars($item);
                }
                self::toAnArray($item);
            }
        }
    }
nguyentrung206
fuente
Su función no devuelve nada. no hay forma de que funcione!
Rotimi