Преобразование многомерных объектов в массив
Я использую амазонскую рекламу продукта api. Значения возвращаются как многомерные объекты.
Он выглядит следующим образом:
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://rads.stackoverflow.com/amzn/click/B005HNF01O"
["ItemLinks"]=>
array(7) {
[0]=>
object(AmazonProduct_ItemLink)#18 (1) {
["_values":protected]=>
array(2) {
["Description"]=>
string(17) "Technical Details"
["URL"]=>
string(217) "http://rads.stackoverflow.com/amzn/click/B005HNF01O"
}
}
[1]=>
object(AmazonProduct_ItemLink)#17 (1) {
["_values":protected]=>
array(2) {
Я имею в виду, что он также имеет массив внутри объектов. Я хотел бы преобразовать их все в многомерный массив.
Ответы
Ответ 1
Вы можете использовать рекурсивную функцию, как показано ниже:
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;
}
Ответ 2
Я знаю, что это уже давно, но вы можете попробовать следующий фрагмент кода:
$array = json_decode (json_encode ($ object), true);
где $object - ответ API.
Ответ 3
function convertObjectToArray($data) {
if (is_object($data)) {
$data = get_object_vars($data);
}
if (is_array($data)) {
return array_map(__FUNCTION__, $data);
}
return $data;
}
Кредит Кевину Оп ден Камп.
Ответ 4
На всякий случай, когда вы пришли сюда, как я, и не нашли правильного ответа для вашей ситуации, эта модифицированная версия одного из предыдущих ответов - это то, что в итоге работает для меня:
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;
}
Исходное значение - строка JSON. Вызов метода выглядит следующим образом:
$array = $this->objToArray(json_decode($json, true));
Ответ 5
Я написал функцию, которая выполняет задание, а также преобразует все строки json в массивы. Это работает очень хорошо для меня.
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;
}
Ответ 6
Это старый вопрос, но я недавно столкнулся с этим и нашел свое собственное решение.
array_walk_recursive($array, function(&$item){
if(is_object($item)) $item = (array)$item;
});
Теперь, если $array
является самим объектом, вы можете просто привести его к массиву, прежде чем поместить его в array_walk_recursive
:
$array = (array)$object;
array_walk_recursive($array, function(&$item){
if(is_object($item)) $item = (array)$item;
});
И мини-пример:
array_walk_recursive($array,function(&$item){if(is_object($item))$item=(array)$item;});
В моем случае у меня был массив объектов stdClass из стороннего источника, у которого было поле/свойство, значение которого мне нужно использовать в качестве ссылки, чтобы найти его, содержащее stdClass, чтобы я мог получить доступ к другим данным в этом элементе. В основном сравнение вложенных ключей в 2 наборах данных.
Мне приходилось делать это много раз, поэтому я не хотел использовать это для каждой вещи, которую мне нужно найти. Решением этой проблемы обычно является array_column
, но это не работает с объектами. Так что я сделал выше, в первую очередь.
Ура!