Comment convertir un objet en tableau?

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

Génère les éléments suivants:

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

Comment puis-je convertir cet objet en un tableau? J'aimerais afficher les éléments suivants:

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

Est-ce possible?

zahir hussain
la source

Réponses:

133

Vous devriez regarder get_object_vars , comme vos propriétés sont déclarées privées, vous devez appeler cela dans la classe et retourner ses résultats.

Soyez prudent, pour les types de données primitifs comme les chaînes, cela fonctionnera très bien, mais je ne sais pas comment il se comporte avec les objets imbriqués.

dans votre cas, vous devez faire quelque chose comme;

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

Tableaux unidimensionnels

Pour convertir des tableaux unidimensionnels, vous pouvez convertir en utilisant (array)ou il y a get_object_vars, ce que Benoit a mentionné dans sa réponse .

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

Ils fonctionnent légèrement différents les uns des autres. Par exemple, get_object_varsretournera un tableau avec uniquement des propriétés accessibles au public à moins qu'il ne soit appelé depuis la portée de l'objet que vous passez (c'est-à-dire dans une fonction membre de l'objet). (array), d'autre part, sera casté dans un tableau avec tous les membres publics, privés et protégés intacts sur le tableau, bien que tous publics maintenant, bien sûr.

Tableaux multidimensionnels

Une méthode un peu sale consiste à utiliser les fonctions JSON natives de PHP> = 5.2 pour encoder en JSON puis décoder vers un tableau. Toutefois, cela n'inclura pas les membres privés et protégés et ne convient pas aux objets contenant des données qui ne peuvent pas être codées JSON (telles que les données binaires).

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

Alternativement, la fonction suivante convertira un objet en un tableau comprenant des membres privés et protégés, extraits d' ici et modifiés pour utiliser la conversion:

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

    return array_map('objectToArray', (array) $object);
}
Andy E
la source
5
La première solution ne gérait pas les mutlidimensions, mais la deuxième solution fonctionnait très bien.
sbuck
1
La 2ème solution m'a rappelé qu'il y a un 2ème paramètre à json_decode () que j'ai oublié .. merci.
Tyler
1
Je me demande pourquoi cette réponse obtient autant de votes. Les deux solutions sont moins claires et jolies que get_object_vars
RJD22
3
@ RJD22: J'ai mis à jour ma réponse pour en faire une ressource de facto, j'espère que vous la considérez digne de ses votes positifs maintenant. ;-) Notez à tout le monde que la "2ème solution" dont parlent les commentaires est la solution JSON, qui était la 2ème de ma première réponse.
Andy E
IMPRESSIONNANT! J'ai été étonné par une solution et j'ai fait défiler la page pour trouver cela!
eozzy
44

Vous pouvez rapidement convertir des objets profondément imbriqués en tableaux associatifs en s'appuyant sur le comportement des fonctions d'encodage / décodage JSON:

$array = json_decode(json_encode($response->response->docs), true);
Mufaddal
la source
2
C'est la réponse la plus simple à ce problème. L'utilisé et cela a fonctionné génial. Merci
Dustin Fraker
7
Juste une note - cela fonctionnera au cas où votre tableau contient des données valides UTF8. Si votre tableau contient un autre encodage, disons Win1250, il échouera, car json_encode échouera (php 5.3)
Radek
Comment le reconvertir en objet?
2017
@Trix utilise à nouveau json json_decode (json_encode ($ array), FALSE); Cela convertit également (récursivement) tous vos sous-tableaux en objets,
Mufaddal
J'aimerais pouvoir remonter plus d'une fois.
JohnFF
34

Prudent:

$array = (array) $object;

effectue une conversion superficielle ($ object-> innerObject = new stdClass () reste un objet) et la conversion dans les deux sens à l'aide de json fonctionne mais ce n'est pas une bonne idée si les performances sont un problème.

Si vous avez besoin que tous les objets soient convertis en tableaux associatifs, voici une meilleure façon de le faire (code extrait de Je ne me souviens pas où):

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
la source
Je ne peux pas lire le tableau résultant d'un transtypage d'objet: codepad.viper-7.com/AkX5pq Avez-vous une explication à ce sujet?
Damien
1
Je préfère cette réponse. La fonction récursive d'Andy E fait essentiellement la même chose, mais je trouve celle-ci plus facile à comprendre.
HartleySan
20
$array = json_decode(json_encode($object), true);

J'ai essayé plusieurs façons de faire un foreachavec un objet et c'est vraiment la solution la plus simple et la plus cool que j'ai vue. Une seule ligne :)

m3nda
la source
Il ne fonctionne parfaitement qu'avec des attributs d'objet public. Ne prend pas en compte les particuliers.
Limon
Voici quelques explications sur l'utilisation de la fonction JsonSerialize, mais ce n'est pas une solution sur une seule ligne et ce que je lis n'est pas une bonne pratique :( stackoverflow.com/questions/7005860/… . Merci pour les conseils.
m3nda
Comment le reconvertir en objet?
2017 à 8h41
18

Version simple:

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

Version récursive mise à jour:

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
la source
2

Essaye ça:-

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

J'ai eu le même problème et je l'ai résolu avec get_object_vars mentionné ci-dessus.

De plus, j'ai dû convertir mon objet avec json_decode et j'ai dû itérer le tableau avec la boucle oldschool "for" (plutôt que for-each).

Lucas Bacciotti
la source
0

Vous pouvez également utiliser la méthode array_values ​​() de php

Rikin Adhyapak
la source
2
Tu ne peux pas. "Array_values ​​() s'attend à ce que le paramètre 1 soit un tableau, objet donné".
manatwork
0

J'ai rencontré un problème avec la réponse d'Andy Earnshaw parce que j'avais factorisé cette fonction dans une classe distincte de mon application, "HelperFunctions", ce qui signifiait que l'appel récursif à objectToArray () avait échoué.

J'ai surmonté cela en spécifiant le nom de classe dans l'appel array_map comme ceci:

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

J'aurais écrit cela dans les commentaires mais je n'ai pas encore assez de réputation.

leon.clements
la source
-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
la source
votre fonction ne renvoie rien. il n'y a aucun moyen que cela fonctionne!
Rotimi