Como faço para converter um objeto em uma matriz?

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

Emite o seguinte:

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

Como posso converter esse objeto em uma matriz? Gostaria de produzir o seguinte:

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

Isso é possível?

zahir hussain
fonte

Respostas:

133

Você deve consultar get_object_vars , como suas propriedades são declaradas privadas, você deve chamar isso dentro da classe e retornar seus resultados.

Tenha cuidado, pois tipos de dados primitivos, como strings, funcionarão muito bem, mas não sei como ele se comporta com objetos aninhados.

no seu caso, você precisa fazer algo como;

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

Matrizes unidimensionais

Para converter matrizes de dimensão única, você pode transmitir usando (array)or there get_object_vars, mencionado por Benoit em sua resposta .

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

Eles funcionam um pouco diferentes um do outro. Por exemplo, get_object_varsretornará uma matriz com apenas propriedades acessíveis ao público, a menos que seja chamada dentro do escopo do objeto que você está passando (ou seja, em uma função de membro do objeto). (array), por outro lado, será transmitido para uma matriz com todos os membros públicos, privados e protegidos intactos na matriz, embora todos sejam públicos agora, é claro.

Matrizes multidimensionais

Um método um pouco sujo é usar as funções JSON nativas do PHP> = 5.2 para codificar para JSON e depois decodificar de volta para uma matriz. Entretanto, isso não inclui membros privados e protegidos e não é adequado para objetos que contêm dados que não podem ser codificados em JSON (como dados binários).

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

Como alternativa, a seguinte função será convertida de um objeto para uma matriz, incluindo membros privados e protegidos, obtidos daqui e modificados para usar a conversão:

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

    return array_map('objectToArray', (array) $object);
}
Andy E
fonte
5
A primeira solução não lidou com as mutlidimensões, mas a segunda solução funcionou muito bem.
sbuck
1
Segunda solução me lembrou que existe um segundo parâmetro para json_decode () que eu esqueci .. obrigado.
Tyler
1
Eu me pergunto por que essa resposta está recebendo tantos votos. Ambas as soluções são menos claros e bonita do que get_object_vars
RJD22
3
@ RJD22: Atualizei minha resposta para torná-lo mais um recurso 'de fato', espero que você o considere digno de seus votos positivos agora. ;-) Observe para todos que a "segunda solução" a que os comentários se referem aqui é a solução JSON, que foi a segunda na minha primeira resposta.
Andy E
IMPRESSIONANTE! Fiquei impressionado com uma solução e rolei para baixo para encontrar isso!
eozzy
44

É possível converter rapidamente objetos profundamente aninhados em matrizes associativas, contando com o comportamento das funções de codificação / decodificação JSON:

$array = json_decode(json_encode($response->response->docs), true);
Mufaddal
fonte
2
Essa é a resposta mais simples para esse problema. Usou e funcionou muito bem. Obrigado
Dustin Fraker
7
Apenas uma observação - isso funcionará caso sua matriz contenha dados válidos UTF8. Se a sua matriz contiver alguma outra codificação, digamos Win1250, ela falhará, pois o json_encode falhará (php 5.3)
Radek
Como convertê-lo novamente em um objeto?
PMPR
@Trix usar json novamente json_decode (json_encode ($ array), FALSE); Isso também (de forma recursiva) converte todos os seus sub matrizes em objetos,
Mufaddal
Eu gostaria de poder melhorar isso mais de uma vez.
JohnFF
34

Cuidado:

$array = (array) $object;

faz uma conversão superficial ($ object-> innerObject = new stdClass () permanece um objeto) e converte-se usando o json works, mas não é uma boa ideia se o desempenho é um problema.

Se você precisar que todos os objetos sejam convertidos em matrizes associativas, aqui está uma maneira melhor de fazer isso (o código extraído não me lembro de onde):

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
fonte
Não consigo ler a matriz resultante de uma conversão de objeto: codepad.viper-7.com/AkX5pq Você tem alguma explicação sobre isso?
Damien
1
Eu gosto mais desta resposta. A função recursiva de Andy E basicamente faz a mesma coisa, mas acho que é mais fácil entender isso.
precisa saber é o seguinte
20
$array = json_decode(json_encode($object), true);

Eu tentei várias maneiras de fazer um foreachcom um objeto e ESTA é realmente a solução mais fácil e legal que eu já vi. Apenas uma linha :)

m3nda
fonte
Funciona perfeito apenas com atributos de objeto público. Não considera particulares.
Limon
Aqui estão algumas explicações sobre o uso da função JsonSerialize, mas não é uma solução de linha e eu ler sobre não é uma boa prática :( stackoverflow.com/questions/7005860/... Obrigado pelo conselho..
m3nda
Como convertê-lo novamente em um objeto?
PMPR
18

Versão simples:

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

Versão recursiva atualizada:

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();
Styx
fonte
2

Experimente o seguinte: -

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

Eu tive o mesmo problema e resolvi-o com get_object_vars mencionado acima.

Além disso, eu tive que converter meu objeto com json_decode e tive que repetir a matriz com o loop "for" da velha escola (e não para cada um).

Lucas Bacciotti
fonte
0

Você também pode usar o método array_values ​​() do php

Rikin Adhyapak
fonte
2
Você não pode. “Array_values ​​() espera que o parâmetro 1 seja array, objeto dado”.
manatwork
0

Encontrei um problema com a resposta de Andy Earnshaw porque havia fatorado essa função em uma classe separada dentro do meu aplicativo, "HelperFunctions", o que significava que a chamada recursiva a objectToArray () falhou.

Eu superei isso especificando o nome da classe na chamada array_map da seguinte forma:

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

Eu teria escrito isso nos comentários, mas ainda não tenho reputação suficiente.

leon.clements
fonte
-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
fonte
sua função não retorna nada. não tem como funcionar!
Rotimi