如何将对象转换为数组?

<?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 )... ) 

这可能吗?

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

要小心,对于像string这样的原始数据types来说,它将工作的很好,但我不知道它是如何performance嵌套对象。

在你的情况下,你必须做一些事情;

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

一维数组

为了转换单维数组,你可以使用(array)或者有get_object_vars ,Benoit在他的答案中提到。

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

他们的工作略有不同。 例如, get_object_vars将只返回一个只有公共访问属性的数组,除非它是在你传递的对象(即对象的成员函数)范围内调用的。 (array)则会转换成一个arrays,所有公共的,私有的和受保护的成员都可以在数组上完整的保留,尽pipe现在所有的public都是这样。

multidimensional array

一个有点肮脏的方法是使用PHP> = 5.2的本地JSON函数编码为JSON,然后解码回数组。 但是,这将不包括私人和受保护的成员。

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

或者,下面的函数将从一个对象转换为包含私有和受保护成员的数组,从这里取出并修改为使用转换:

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

小心:

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

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

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

简单版本:

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

更新recursion版本:

 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(); 
 $array = json_decode(json_encode($object), true); 

我尝试了几种方法来处理一个对象的foreach ,这真的是我见过的最简单最酷的解决方法。 只有一行:)

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

我碰到了Andy Earnshaw的答案,因为我已经将这个函数分解到我的应用程序中的一个单独的类“HelperFunctions”,这意味着对objectToArray()的recursion调用失败。

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

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

我会在评论中写下这个,但是我还没有足够的声望。

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