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.
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;
}
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.
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.
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;
}
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é!
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));