<?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
)...
)
这可能吗?
答案 0 :(得分:371)
对于转换单维数组,您可以使用(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&gt; = 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);
}
答案 1 :(得分:123)
您应该查看get_object_vars,因为您的属性被声明为私有,您应该在类中调用它并返回其结果。
要小心,对于像字符串这样的原始数据类型,它会很好用,但我不知道它对嵌套对象的行为。
在你的情况下,你必须做类似的事情;
<?php
print_r(get_object_vars($response->response->docs));
?>
答案 2 :(得分:42)
您可以依靠JSON编码/解码函数的行为快速将深层嵌套对象转换为关联数组:
$array = json_decode(json_encode($response->response->docs), true);
答案 3 :(得分:33)
小心:
$array = (array) $object;
进行浅层转换($ object-&gt; 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;
}
答案 4 :(得分:19)
$array = json_decode(json_encode($object), true);
我尝试了几种使用对象做foreach
的方法,而这确实是我见过的最简单,最酷的解决方法。只有一行:)
答案 5 :(得分:17)
简易版:
$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();
答案 6 :(得分:1)
试试这个: -
<?php
print_r(json_decode(json_encode($response->response->docs),true));
?>
答案 7 :(得分:1)
我遇到了同样的问题,我用上面提到的 get_object_vars 解决了这个问题。
此外,我必须使用 json_decode 转换我的对象,我不得不使用oldschool“for”循环迭代数组(而不是for-each)。
答案 8 :(得分:-1)
你也可以使用php的array_values()方法
答案 9 :(得分:-1)
我遇到了Andy Earnshaw的问题,因为我已经将这个函数考虑到了我的应用程序中的一个单独的类,&#34; HelperFunctions&#34;,这意味着对objectToArray()的递归调用失败了
我通过在array_map调用中指定类名来克服这个问题,如下所示:
public function objectToArray($object) {
if (!is_object($object) && !is_array($object))
return $object;
return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}
我会在评论中写这篇文章,但我还没有足够的声誉。
答案 10 :(得分:-3)
//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);
}
}
}