web-dev-qa-db-fra.com

Convertir des objets multidimensionnels en tableau

J'utilise l'API de publicité pour produits Amazon. Les valeurs sont renvoyées sous forme d'objets multidimensionnels.

Cela ressemble à ceci:

object(AmazonProduct_Result)#222 (5) {
  ["_code":protected]=>
  int(200)
  ["_data":protected]=>
  string(16538) 
array(2) {
    ["IsValid"]=>
    string(4) "True"
    ["Items"]=>
    array(1) {
      [0]=>
      object(AmazonProduct_Item)#19 (1) {
        ["_values":protected]=>
        array(11) {
          ["ASIN"]=>
          string(10) "B005HNF01O"
          ["ParentASIN"]=>
          string(10) "B008RKEIZ8"
          ["DetailPageURL"]=>
          string(120) "http://www.Amazon.com/Case-Logic-TBC-302-FFP-Compact/dp/B005HNF01O?SubscriptionId=AKIAJNFRQCIJLTY6LDTA&tag=*********-20"
          ["ItemLinks"]=>
          array(7) {
            [0]=>
            object(AmazonProduct_ItemLink)#18 (1) {
              ["_values":protected]=>
              array(2) {
                ["Description"]=>
                string(17) "Technical Details"
                ["URL"]=>
                string(217) "http://www.Amazon.com/Case-Logic-TBC-302-FFP-Compact/dp/tech-data/B005HNF01O%3FSubscriptionId%3DAKIAJNFRQCIJLTY6LDTA%26tag%*******-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB005HNF01O"
              }
            }
            [1]=>
            object(AmazonProduct_ItemLink)#17 (1) {
              ["_values":protected]=>
              array(2) {

Je veux dire qu'il a aussi un tableau à l'intérieur des objets. Je voudrais tous les convertir en un tableau multidimensionnel.

18
user1091558

Vous pouvez utiliser une fonction récursive comme ci-dessous:

function objToArray($obj, &$arr){

    if(!is_object($obj) && !is_array($obj)){
        $arr = $obj;
        return $arr;
    }

    foreach ($obj as $key => $value)
    {
        if (!empty($value))
        {
            $arr[$key] = array();
            objToArray($value, $arr[$key]);
        }
        else
        {
            $arr[$key] = $value;
        }
    }
    return $arr;
}
17
SubRed

Je sais que c'est vieux, mais vous pouvez essayer le code suivant:

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

où $ object est la réponse de l'API.

95
kendepelchin
function convertObjectToArray($data) {
    if (is_object($data)) {
        $data = get_object_vars($data);
    }

    if (is_array($data)) {
        return array_map(__FUNCTION__, $data);
    }

    return $data;
}

Nous remercions Kevin Op den Kamp.

1
Quolonel Questions

J'ai écrit une fonction qui fait le travail et convertit également toutes les chaînes JSON en tableaux. Cela fonctionne très bien pour moi.

function is_json($string) {
    // php 5.3 or newer needed;
    json_decode($string);
    return (json_last_error() == JSON_ERROR_NONE);
}

function objectToArray($objectOrArray) {
    // if is_json -> decode :
    if (is_string($objectOrArray)  &&  is_json($objectOrArray)) $objectOrArray = json_decode($objectOrArray);

    // if object -> convert to array :
    if (is_object($objectOrArray)) $objectOrArray = (array) $objectOrArray;

    // if not array -> just return it (probably string or number) :
    if (!is_array($objectOrArray)) return $objectOrArray;

    // if empty array -> return [] :
    if (count($objectOrArray) == 0) return [];

    // repeat tasks for each item :
    $output = [];
    foreach ($objectOrArray as $key => $o_a) {
        $output[$key] = objectToArray($o_a);
    }
    return $output;
}
0
Amin Adel

C'est une vieille question, mais je me suis récemment heurté à cette question et j'ai proposé ma propre solution.

array_walk_recursive($array, function(&$item){
    if(is_object($item)) $item = (array)$item;
});

Maintenant, si $array est un objet lui-même, vous pouvez simplement le convertir en tableau avant de le placer dans array_walk_recursive:

$array = (array)$object;
array_walk_recursive($array, function(&$item){
    if(is_object($item)) $item = (array)$item;
});

Et le mini-exemple:

array_walk_recursive($array,function(&$item){if(is_object($item))$item=(array)$item;});

Dans mon cas, j'avais un tableau d'objets stdClass d'une source tierce qui contenait un champ/une propriété dont la valeur devait être utilisée comme référence pour trouver qu'il contenait stdClass afin que je puisse accéder à d'autres données de cet élément. Fondamentalement, comparer des clés imbriquées dans 2 ensembles de données.

Je dois le faire plusieurs fois, donc je ne voulais pas en parler pour chaque élément que je devais trouver. La solution à ce problème est généralement array_column, mais cela ne fonctionne pas sur les objets. Alors j'ai fait ce qui précède en premier.

À votre santé!

0
ArtisticPhoenix

Juste au cas où vous viendriez comme moi sans trouver la bonne réponse à votre situation, cette version modifiée de l’une des réponses précédentes est ce qui a finalement fonctionné pour moi:

protected function objToArray($obj)
{
    // Not an object or array
    if (!is_object($obj) && !is_array($obj)) {
        return $obj;
    }

    // Parse array
    foreach ($obj as $key => $value) {
        $arr[$key] = $this->objToArray($value);
    }

    // Return parsed array
    return $arr;
}

La valeur d'origine est une chaîne JSON. L'appel de méthode ressemble à ceci: 

$array = $this->objToArray(json_decode($json, true));
0
Ixalmida