PHP递归地将对象转换为数组

时间:2014-03-27 00:49:27

标签: php arrays recursion casting

我试图以递归方式将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;
}

但是,我仍然在外部数组中使用对象。为什么是这样?我的功能不正确吗?

7 个答案:

答案 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。它允许您将对象视为数组。

http://www.php.net/manual/en/class.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;
}