Come faccio a convertire un oggetto in un array?


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

Emette il seguente:

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

Come posso convertire questo oggetto in un array? Vorrei produrre quanto segue:

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

È possibile?

Risposte:


133

Dovresti guardare get_object_vars , poiché le tue proprietà sono dichiarate private dovresti chiamarlo all'interno della classe e restituire i suoi risultati.

Fai attenzione, per tipi di dati primitivi come le stringhe funzionerà alla grande, ma non so come si comporti con gli oggetti nidificati.

nel tuo caso devi fare qualcosa del genere;

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

385

Matrici monodimensionali

Per convertire matrici a dimensione singola, puoi eseguire il cast usando (array)o c'è get_object_vars, cosa che Benoit ha menzionato nella sua risposta .

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

Funzionano leggermente diversi l'uno dall'altro. Ad esempio, get_object_varsrestituirà un array con solo proprietà accessibili al pubblico a meno che non venga chiamato dall'ambito dell'oggetto che si sta passando (ovvero in una funzione membro dell'oggetto). (array)d'altra parte, eseguirà il cast su un array con tutti i membri pubblici, privati ​​e protetti intatti sull'array, anche se ora tutti i pubblici, ovviamente.

Matrici multidimensionali

Un metodo un po 'sporco consiste nell'utilizzare le funzioni JSON native di PHP> = 5.2 per codificare in JSON e quindi decodificare nuovamente in un array. Ciò non includerà membri privati ​​e protetti, tuttavia, e non è adatto per oggetti che contengono dati che non possono essere codificati JSON (come i dati binari).

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

In alternativa, la seguente funzione verrà convertita da un oggetto in un array che include membri privati ​​e protetti, presi da qui e modificati per usare il casting:

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

    return array_map('objectToArray', (array) $object);
}

5
La prima soluzione non ha gestito le mutlidimensioni, ma la seconda soluzione ha funzionato alla grande.
sbuck

1
La seconda soluzione mi ha ricordato che esiste un secondo parametro per json_decode () che ho dimenticato .. grazie.
Tyler,

1
Mi chiedo perché questa risposta stia ottenendo così tanti voti. Entrambe le soluzioni sono meno chiare e carine di get_object_vars
RJD22,

3
@ RJD22: ho aggiornato la mia risposta per renderla più una risorsa "di fatto", spero che ora la consideri degna dei suoi voti positivi. ;-) Nota a tutti che la "seconda soluzione" a cui fanno riferimento i commenti è la soluzione JSON, che è stata la seconda nella mia prima risposta.
Andy E

ECCEZIONALE! Sono stato sorpreso da una soluzione e ho scorrere verso il basso per trovare questo!
eozzy,

44

È possibile convertire rapidamente oggetti profondamente nidificati in array associativi facendo affidamento sul comportamento delle funzioni di codifica / decodifica JSON:

$array = json_decode(json_encode($response->response->docs), true);

2
Questa è la risposta più semplice a questo problema. L'ho usato e ha funzionato benissimo. Grazie
Dustin Fraker,

7
Solo una nota: funzionerà nel caso in cui l'array contenga dati validi UTF8. Se il tuo array contiene qualche altra codifica, diciamo Win1250, fallirà, poiché json_encode fallirà (php 5.3)
Radek

Come riconvertirlo in un oggetto?
Pmpr

@Trix usa di nuovo json json_decode (json_encode ($ array), FALSE); anche questo (ricorsivamente) converte tutti i tuoi array secondari in oggetti,
Mufaddal

Vorrei poterlo aggiungere più di una volta.
JohnFF,

34

Attenzione:

$array = (array) $object;

esegue una conversione superficiale ($ object-> innerObject = new stdClass () rimane un oggetto) e la conversione avanti e indietro utilizzando json funziona ma non è una buona idea se le prestazioni sono un problema.

Se hai bisogno di convertire tutti gli oggetti in array associativi qui è un modo migliore per farlo (codice strappato da non ricordo dove):

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;
}

Non riesco a leggere l'array risultante da un casting di oggetti: codepad.viper-7.com/AkX5pq Hai qualche spiegazione al riguardo?
Damien,

1
Questa risposta mi piace di più. La funzione ricorsiva di Andy E essenzialmente fa la stessa cosa, ma trovo che questa sia più facile da capire.
HartleySan

20
$array = json_decode(json_encode($object), true);

Ho provato diversi modi per farlo foreachcon un oggetto e QUESTO è davvero la soluzione più semplice e interessante che abbia mai visto. Solo una riga :)


Funziona perfettamente solo con attributi di oggetti pubblici. Non considera quelli privati.
Limon,

Ecco alcune spiegazioni sull'uso della funzione JsonSerialize, ma non è una soluzione di una riga e ho letto che non è una buona pratica :( stackoverflow.com/questions/7005860/… . Grazie per il consiglio.
m3nda

Come riconvertirlo in un oggetto?
Pmpr

18

Versione semplice:

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

Versione ricorsiva aggiornata:

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();

2

Prova questo:-

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

2

Ho avuto lo stesso problema e l'ho risolto con get_object_vars sopra menzionato.

Inoltre, ho dovuto convertire il mio oggetto con json_decode e ho dovuto iterare l'array con il ciclo oldschool "for" (piuttosto che per-each).


0

Puoi anche usare il metodo array_values ​​() di php


2
Non puoi. "Array_values ​​() prevede che il parametro 1 sia array, oggetto assegnato".
arte

0

Ho riscontrato un problema con la risposta di Andy Earnshaw perché avevo inserito questa funzione in una classe separata all'interno della mia applicazione, "HelperFunctions", il che significava che la chiamata ricorsiva a objectToArray () non è riuscita.

Ho superato questo specificando il nome della classe all'interno della chiamata array_map in questo modo:

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

Avrei scritto questo nei commenti ma non ho ancora abbastanza reputazione.


-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);
            }
        }
    }

la tua funzione non restituisce nulla. non c'è modo che funzioni!
Rotimi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.