26

我正在使用亚马逊产品广告 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://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) {

我的意思是它在对象内部也有数组。我想将它们全部转换为多维数组。

4

6 回答 6

135

我知道这很旧,但您可以尝试以下代码:

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

其中 $object 是 API 的响应。

于 2013-08-07T14:52:57.873 回答
24

您可以使用如下递归函数:

function object_to_array($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;
}
于 2012-11-26T15:41:46.920 回答
4
function convertObjectToArray($data) {
    if (is_object($data)) {
        $data = get_object_vars($data);
    }

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

    return $data;
}

归功于凯文奥普登坎普。

于 2015-12-11T15:06:53.447 回答
1

我编写了一个函数来完成这项工作,并将所有 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;
}
于 2018-01-31T07:18:24.753 回答
1

这是一个老问题,但我最近遇到了这个问题并提出了自己的解决方案。

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;});

在我的情况下,我有一个来自第 3 方源的 stdClass 对象数组,该数组具有一个字段/属性,我需要将其值用作参考以查找其包含的 stdClass,以便我可以访问该元素中的其他数据。基本上比较 2 个数据集中的嵌套键。

我必须这样做很多次,所以我不想为我需要找到的每个项目都进行搜索。该问题的解决方案通常是array_column,但这不适用于对象。所以我先做了上面的。

于 2018-12-14T22:10:39.957 回答
0

以防万一您像我一样来到这里并且没有找到适合您情况的正确答案,这个先前答案之一的修改版本最终对我有用:

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));
于 2016-08-24T18:27:28.420 回答