如何将对象转换为数组?


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

这可能吗?

Answers:


133

您应该查看get_object_vars,因为您的属性被声明为私有,所以您应该在类内部调用此方法并返回其结果。

注意,对于像字符串这样的原始数据类型,它会很好用,但是我不知道它在嵌套对象中的行为。

在您的情况下,您必须执行类似操作;

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

385

一维数组

对于转换一维数组,您可以使用(array)或进行转换get_object_vars,Benoit在他的回答中提到过 。

// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

它们的工作原理彼此略有不同。例如,get_object_vars将返回仅具有公共可访问属性的数组,除非在要传递的对象范围内(即,在对象的成员函数中)调用该数组。 (array)另一方面,将强制转换为一个数组,其中所有公共,私有和受保护的成员都完整保留在该数组中,当然,现在是所有公共成员。

多维数组

一种比较脏的方法是使用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);
}

5
第一个解决方案无法处理多重动因,但第二个解决方案效果很好。
sbuck 2012年

1
第二个解决方案提醒我,我忘记了json_decode()的第二个参数..谢谢。
泰勒

1
我不知道为什么这个答案能获得这么多的选票。两种解决方案都不如get_object_vars清晰和美观
RJD22

3
@ RJD22:我已经更新了答案,使其更多地成为“事实上的”资源,希望您现在认为它值得投票。;-)请注意其他人,这里的注释所指的“第二个解决方案”是JSON解决方案,这是我的第一个答案。
Andy E

真棒!我对解决方案感到惊讶,然后向下滚动找到它!
eozzy

44

您可以依靠JSON编码/解码功能的行为,将深层嵌套的对象快速转换为关联数组:

$array = json_decode(json_encode($response->response->docs), true);

2
这是对此问题最简单的答案。使用它,它很棒。谢谢
Dustin Fraker 2013年

7
请注意-如果您的数组包含UTF8有效数据,这将起作用。如果您的数组包含其他编码,比如说Win1250,它将失败,因为json_encode将失败(php 5.3)
Radek

如何将其转换回对象?
Pmpr

@Trix再次使用json json_decode(json_encode($ array),FALSE);这也(递归)将所有子数组转换为对象,
Mufaddal

我希望我可以不止一次地加价。
JohnFF

34

小心:

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

我无法读取对象转换产生的数组:codepad.viper-7.com/AkX5pq对此有任何解释吗?
Damien

1
我最喜欢这个答案。Andy E的递归函数本质上是做同样的事情,但是我发现这一点更容易理解。
HartleySan 2014年

20
$array = json_decode(json_encode($object), true);

我尝试了几种方法来foreach处理对象,这确实是我所见过的最简单,最酷的解决方法。仅一行:)


它仅适用于公共对象属性。不考虑私人的。
利蒙2014年

这里是有关使用JsonSerialize函数的一些说明,但不是一种解决方案,我读到的也不是一个好习惯:( stackoverflow.com/questions/7005860/…。谢谢您的建议。
m3nda

如何将其转换回对象?
Pmpr

18

简单版本:

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

2

试试这个:-

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

2

我遇到了同样的问题,并使用上面提到的get_object_vars解决了这个问题。

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



0

我遇到了与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);
}

我会在评论中写这个,但是我没有足够的声誉。


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

您的函数不返回任何内容。这是行不通的!
Rotimi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.