2014-03-27 89 views
0

我想递归地将一个php对象转换为数组。我写的功能是这样的: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; 
} 

但是,我仍然以我的外部数组中的对象结束。为什么是这样?我的功能不正确?

+2

你没有修改代码中的任何东西 – zerkms

回答

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; 

而且从阿齐兹萨利赫,参考$attribute这样你就可以修改它:

foreach ($array as &$attribute) { 
+0

第二部分检查它是否是字符串是因为我最终把它变成了json。如果它是一个字符串,我不需要进一步分割它。 – 735Tesla

+0

如果它不是一个字符串,你将它转换为一个数组(array)。所以整数,浮点数,布尔值将是一个数组。 – AbraCadaver

+0

我以为我在说如果它不是一个字符串,然后将其转换为数组?不'''反转条件? – 735Tesla

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

这将直接修改阵列子元件。我通常会选择第二种解决方案,因为它对我来说更加优雅。

0

你正在检查is_array,当你应该检查is_object时 - 如果它已经是一个数组,你可能不需要递归到函数中。您可以同时检查两个对象,以便对象数组也可以转换。