如何将对象转换为数组?

时间:2010-03-19 11:42:32

标签: php

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

这可能吗?

11 个答案:

答案 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);
            }
        }
    }