如何将对象转换为数组?

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

这可能吗?

484479 次浏览

一维数组

对于转换一维数组,可以使用(array)get_object_vars进行强制转换,这是Benoit在 他的回答 . < / p >
// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

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

多维数组

一个有点脏的方法是使用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);

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

function objectToArray ($object) {
if(!is_object($object) && !is_array($object))
return $object;


return array_map('objectToArray', (array) $object);
}

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

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

在你的情况下,你必须这样做;

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

注意:

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

我尝试了几种方法来用对象做foreach,这真的是我见过的最简单和最酷的工作方法。只有一行:)

简单的版本:

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

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

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

我本想在评论中写下这句话,但我还没有足够的声誉。

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

试试这个:

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

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

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