【问题标题】:Convert multidimensional objects to array将多维对象转换为数组
【发布时间】:2012-11-14 02:41:37
【问题描述】:

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

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

【问题讨论】:

  • 为什么需要这个数组?许多常见的数组任务(如 foreach)也可以与对象一起使用。
  • 如何检查对象中是否存在值?我尝试过使用 isset,但它不起作用。
  • 因为它是一个对象,所以值应该一直存在。您应该检查它是否设置为可用的东西(或只是空)
  • 谢谢玻璃先生。当我将它与 is_null 函数一起使用时它可以工作。谢谢

标签: php arrays multidimensional-array


【解决方案1】:

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

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

其中 $object 是 API 的响应。

【讨论】:

  • 你知道吗。我爱你。
  • 我相信你一直都明白这个,超级英雄,但你刚刚救了我的命。
  • 很棒的 hack,喜欢它。
  • 那么,为什么这还不是答案呢?
  • 太棒了!正是我需要的
【解决方案2】:

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

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

【讨论】:

  • 你可能需要让它更整洁
  • 这个常见请求的稍微简洁的方法:function objectToArray($data) { if (is_object($data)) { $data = get_object_vars($data); } if (is_array($data)) { return array_map(FUNCTION, $data); } 其他 { 返回 $data; } }
  • 你好@SubRed,你的回答似乎对我有帮助!我的查询是我们必须在&$arr 中传递的内容?
  • hi @SagarPanchal var &$arr 是您的结果变量。您可以像这样使用它gist.github.com/anonymous/346f780acda292dea4cd。我希望它有所帮助。
【解决方案3】:
function convertObjectToArray($data) {
    if (is_object($data)) {
        $data = get_object_vars($data);
    }

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

    return $data;
}

感谢 Kevin Op den Kamp。

【讨论】:

    【解决方案4】:

    我编写了一个函数来完成这项工作,并将所有 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;
    }
    

    【讨论】:

      【解决方案5】:

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

      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,但这不适用于对象。所以我先做了上面的。

      【讨论】:

      • hmm 由于某种原因,此代码不适用于我尝试转换的数组,即使它看起来应该可以工作。一直想不通为什么。这是代码示例:3v4l.org/YRFLq
      • ^ 稍微减少了问题:3v4l.org/Vn6aH。看起来具有对象属性的对象不起作用?
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 2016-11-28
        • 2017-09-27
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多