如何将对象转换为数组?

zah*_*in 202 php

<?php
   print_r($response->response->docs);
?>
Run Code Online (Sandbox Code Playgroud)

输出以下内容:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)
Run Code Online (Sandbox Code Playgroud)

如何将此对象转换为数组?我想输出以下内容:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)
Run Code Online (Sandbox Code Playgroud)

这可能吗?

And*_*y E 383

一维数组

对于转换单维数组,您可以使用Benoit在其答案中提到的 (array)或者使用.get_object_vars

// Cast to an array
$array = (array) $object;
Run Code Online (Sandbox Code Playgroud)
// get_object_vars
$array = get_object_vars($object);
Run Code Online (Sandbox Code Playgroud)

它们的工作方式略有不同.例如,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);
Run Code Online (Sandbox Code Playgroud)

或者,以下函数将从对象转换为包含私有成员和受保护成员的数组,从此处获取并修改为使用强制转换:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}
Run Code Online (Sandbox Code Playgroud)

  • 第一种解决方案没有处理多种维度,但第二种解决方案效果很好. (5认同)
  • @ RJD22:我已经更新了我的答案,使其更像是一个"事实上的"资源,希望你认为它现在值得投票.;-)请注意其他人,这里评论所指的"第二个解决方案"是JSON解决方案,这是我第一个答案中的第二个. (3认同)

Ben*_*oit 130

您应该查看get_object_vars,因为您的属性被声明为private,您应该在类中调用它并返回其结果.

要小心,对于像字符串这样的原始数据类型,它会很好用,但我不知道它对嵌套对象的行为方式.

在你的情况下,你必须做一些事情;

<?php
   print_r(get_object_vars($response->response->docs));
?>
Run Code Online (Sandbox Code Playgroud)


Muf*_*dal 43

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

$array = json_decode(json_encode($response->response->docs), true);
Run Code Online (Sandbox Code Playgroud)

  • 只是一个注释 - 这将适用于您的数组包含UTF8有效数据.如果您的数组包含一些其他编码,让我们说Win1250,它将失败,因为json_encode将失败(php 5.3) (7认同)
  • 这是解决这个问题的最简单方法.使用它,它工作得很棒.谢谢 (2认同)

Ser*_*gio 33

小心:

$array = (array) $object;
Run Code Online (Sandbox Code Playgroud)

做浅层转换($ 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;
}
Run Code Online (Sandbox Code Playgroud)


m3n*_*nda 19

$array = json_decode(json_encode($object), true);
Run Code Online (Sandbox Code Playgroud)

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


Sty*_*tyx 17

简单版本:

$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();
Run Code Online (Sandbox Code Playgroud)

更新的递归版本:

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();
Run Code Online (Sandbox Code Playgroud)

  • 简单,适用于PHP5.3 +.做得好! (3认同)