【问题标题】:How do I convert an object to an array?如何将对象转换为数组?
【发布时间】:2011-01-29 10:21:15
【问题描述】:
<?php
   print_r($response->response->docs);
?>

输出以下内容:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)

如何将此对象转换为数组?我想输出以下内容:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)

这可能吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    一维数组

    对于转换单维数组,您可以使用(array)get_object_vars 进行转换,Benoit 在 his answer.

    // Cast to an array
    $array = (array) $object;
    
    // get_object_vars
    $array = get_object_vars($object);
    

    它们的工作方式略有不同。例如,get_object_vars 将返回一个仅具有可公开访问属性的数组,除非它是在您传递的对象范围内(即在对象的成员函数中)调用的。另一方面,(array) 将转换为一个数组,该数组中的所有公共、私有和受保护成员都完好无损,当然现在都是公共的。

    多维数组

    一个有点脏的方法是使用 PHP >= 5.2 的原生 JSON 函数编码为 JSON,然后解码回一个数组。但是,这将不包括私有成员和受保护成员,并且不适用于包含无法 JSON 编码的数据(例如二进制数据)的对象。

    // The second parameter of json_decode forces parsing into an associative array
    $array = json_decode(json_encode($object), true);
    

    或者,以下函数将从一个对象转换为一个数组,包括私有成员和受保护成员,取自 here 并修改为使用强制转换:

    function objectToArray ($object) {
        if(!is_object($object) && !is_array($object))
            return $object;
    
        return array_map('objectToArray', (array) $object);
    }
    

    【讨论】:

    • 第一个解决方案不能处理多维度问题,但第二个解决方案效果很好。
    • 第二个解决方案提醒我有一个 json_decode() 的第二个参数,我忘记了.. 谢谢。
    • 我想知道为什么这个答案会获得如此多的选票。这两种解决方案都没有 get_object_vars 清晰和漂亮
    • @RJD22:我已经更新了我的答案,使它更像是一个“事实上的”资源,希望你现在认为它值得它的支持。 ;-) 请注意,此处 cmets 所指的“第二个解决方案”是 JSON 解决方案,这是我的第一个答案中的第二个。
    • 太棒了!我对一个解决方案感到惊讶并向下滚动找到了这个!
    【解决方案2】:

    您应该查看 get_object_vars ,因为您的属性被声明为私有,您应该在类中调用它并返回其结果。

    小心,对于像字符串这样的原始数据类型,它会很好地工作,但我不知道它在嵌套对象中的表现如何。

    在你的情况下,你必须做类似的事情;

    <?php
       print_r(get_object_vars($response->response->docs));
    ?>
    

    【讨论】:

      【解决方案3】:

      小心:

      $array = (array) $object;
      

      进行浅转换($object->innerObject = new stdClass() 仍然是一个对象)并使用 json 来回转换工作,但如果性能是一个问题,这不是一个好主意。

      如果您需要将所有对象转换为关联数组,这里是一种更好的方法(代码从我不记得在哪里翻录):

      function toArray($obj)
      {
          if (is_object($obj)) $obj = (array)$obj;
          if (is_array($obj)) {
              $new = array();
              foreach ($obj as $key => $val) {
                  $new[$key] = toArray($val);
              }
          } else {
              $new = $obj;
          }
      
          return $new;
      }
      

      【讨论】:

      • 我无法读取对象转换产生的数组:codepad.viper-7.com/AkX5pq你对此有什么解释吗?
      • 我最喜欢这个答案。 Andy E 的递归函数本质上是做同样的事情,但我觉得这个更容易理解。
      【解决方案4】:

      您可以依靠 JSON 编码/解码函数的行为将深度嵌套的对象快速转换为关联数组:

      $array = json_decode(json_encode($response->response->docs), true);
      

      【讨论】:

      • 这是这个问题最简单的答案。用过它,效果很棒。谢谢
      • 请注意 - 如果您的数组包含 UTF8 有效数据,这将起作用。如果您的数组包含其他编码,比如说 Win1250,它将失败,因为 json_encode 将失败(php 5.3)
      • 如何将其转回对象?
      • @Trix 再次使用 json json_decode(json_encode($array), FALSE);这也(递归地)将所有子数组转换为对象,
      • 我希望我能不止一次地升级它。
      【解决方案5】:
      $array = json_decode(json_encode($object), true);
      

      我尝试了几种方法来使用对象执行foreach,这确实是我见过的最简单和最酷的解决方法。就一行:)

      【讨论】:

      • 它只适用于公共对象属性。不考虑私有的。
      • 这里有一些关于使用 JsonSerialize 函数的解释,但不是单行解决方案,我读到的不是一个好习惯:(stackoverflow.com/questions/7005860/…。谢谢你的建议。
      • 如何将其转回对象?
      【解决方案6】:

      简单版:

      $arrayObject = new ArrayObject($object);
      $array = $arrayObject->getArrayCopy();
      

      更新的递归版本:

      class RecursiveArrayObject extends ArrayObject
      {
          function getArrayCopy()
          {
              $resultArray = parent::getArrayCopy();
              foreach($resultArray as $key => $val) {
                  if (!is_object($val)) {
                      continue;
                  }
                  $o = new RecursiveArrayObject($val);
                  $resultArray[$key] = $o->getArrayCopy();
              }
              return $resultArray;
          }
      }
      
      $arrayObject = new RecursiveArrayObject($object);
      $array = $arrayObject->getArrayCopy();
      

      【讨论】:

        【解决方案7】:

        你也可以使用php的array_values()方法

        【讨论】:

        • 你不能。 “array_values() 期望参数 1 是数组,给定对象”。
        【解决方案8】:

        我在 Andy Earnshaw 的回答中遇到了问题,因为我已将此函数分解到我的应用程序中的一个单独的类“HelperFunctions”中,这意味着对 objectToArray() 的递归调用失败。

        我通过在 array_map 调用中指定类名来克服这个问题,如下所示:

        public function objectToArray($object) {
            if (!is_object($object) && !is_array($object))
                return $object;
            return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
        }
        

        我会在 cmets 上写这个,但我还没有足够的声誉。

        【讨论】:

          【解决方案9】:
          //My Function is worked. Hope help full for you :)
                $input = [
                      '1' => (object) [1,2,3],
                      '2' => (object) [4,5,6,
                          (object) [6,7,8,
                          [9, 10, 11,
                              (object) [12, 13, 14]]]
                      ],
                      '3' =>[15, 16, (object)[17, 18]]
                  ];
          
                  echo "<pre>";
                  var_dump($input);
                  var_dump(toAnArray($input));
          
                public function toAnArray(&$input) {
          
                  if (is_object($input)) {
                      $input = get_object_vars($input);
                  }
                  foreach ($input as &$item) {
                      if (is_object($item) || is_array($item)) {
                          if (is_object($item)) {
                              $item = get_object_vars($item);
                          }
                          self::toAnArray($item);
                      }
                  }
              }
          

          【讨论】:

          • 你的函数没有返回任何东西。没办法!
          【解决方案10】:

          试试这个:-

           <?php
            print_r(json_decode(json_encode($response->response->docs),true));
           ?>
          

          【讨论】:

            【解决方案11】:

            我遇到了同样的问题,我用上面提到的 get_object_vars 解决了它。

            此外,我必须使用 json_decode 转换我的对象,并且必须使用老式的“for”循环(而不是 for-each)来迭代数组。

            【讨论】:

              猜你喜欢
              • 2018-02-13
              • 2022-01-23
              • 2018-07-27
              • 2018-12-12
              • 1970-01-01
              相关资源
              最近更新 更多