Преобразование многомерных объектов в массив

Я использую амазонскую рекламу продукта 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, но это не работает с объектами. Так что я сделал выше, в первую очередь.

Ура!