我试图以递归方式将php对象转换为数组。我写的函数是:
public function object_to_array($obj) {
$array = (array) $obj;
foreach ($array as $attribute) {
if (is_array($attribute)) $attribute = $this->object_to_array($attribute);
if (!is_string($attribute)) $attribute = (array) $attribute;
}
return $array;
}
但是,我仍然在外部数组中使用对象。为什么是这样?我的功能不正确吗?
答案 0 :(得分:2)
您想要检查它是否是一个对象而不是一个数组,尽管您可以同时执行这两个操作:
if (is_object($attribute) || is_array($attribute)) $attribute = $this->object_to_array($attribute);
//I don't see a need for this
//if (!is_string($attribute)) $attribute = (array) $attribute;
来自Aziz Saleh,请参考$attribute
,以便修改它:
foreach ($array as &$attribute) {
答案 1 :(得分:1)
尝试使用ArrayObject内置的PHP。它允许您将对象视为数组。
答案 2 :(得分:1)
这是我的版本。首先它将测试传递的参数是数组还是对象。如果是这样,它将转换为数组(如果需要),然后遍历每个元素(通过引用)并递归地运行该函数。当达到标量值时,它将仅返回未修改的值。似乎可以工作:-)
function object_to_array($obj) {
//only process if it's an object or array being passed to the function
if(is_object($obj) || is_array($obj)) {
$ret = (array) $obj;
foreach($ret as &$item) {
//recursively process EACH element regardless of type
$item = object_to_array($item);
}
return $ret;
}
//otherwise (i.e. for scalar values) return without modification
else {
return $obj;
}
}
答案 3 :(得分:0)
你需要这样做:
foreach ($array as &$attribute) {
这将保留属性的更改,因为您通过引用使用它。
或者:
foreach ($array as $sub => $attribute) {
if (is_array($attribute)) $array[$sub] = $this->object_to_array($attribute);
if (!is_string($attribute)) $array[$sub] = (array) $attribute;
}
这将直接修改数组子元素。我通常会选择第二种解决方案,因为它对我来说更加优雅。
答案 4 :(得分:0)
您正在检查is_array,当您应该检查is_object时 - 如果它已经是一个数组,您可能不需要递归到该函数中。您可以检查两者,以便也可以转换对象数组。
答案 5 :(得分:0)
您需要进行递归操作。
这是我想出的最短的时间:
$toArray = function($x) use(&$toArray)
{
return is_scalar($x)
? $x
: array_map($toArray, (array) $x);
};
$array = $toArray($object);
答案 6 :(得分:0)
我创建了此函数
简单高效:
function object2array_recursive( $oject)
{
$array = json_decode(json_encode($oject), true);
return $array;
}