如何使用stdClass()将数组转换为对象

125

我已经创建了以下数组:

$clasa = array(
        'e1' => array('nume' => 'Nitu', 'prenume' => 'Andrei', 'sex' => 'm', 'varsta' => 23),
        'e2' => array('nume' => 'Nae', 'prenume' => 'Ionel', 'sex' => 'm', 'varsta' => 27),
        'e3' => array('nume' => 'Noman', 'prenume' => 'Alice', 'sex' => 'f', 'varsta' => 22),
        'e4' => array('nume' => 'Geangos', 'prenume' => 'Bogdan', 'sex' => 'm', 'varsta' => 23),
        'e5' => array('nume' => 'Vasile', 'prenume' => 'Mihai', 'sex' => 'm', 'varsta' => 25)
);

我想知道如何使用stdClass()将此数组转换为对象,我是PHP初学者,一个简单的例子会非常有帮助,我尝试搜索类似的问题,但答案太复杂了,超出了我对基本类和对象的理解。

8个回答

246

你只需要添加这段代码

$clasa = (object) array(
            'e1' => array('nume' => 'Nitu', 'prenume' => 'Andrei', 'sex' => 'm', 'varsta' => 23),
            'e2' => array('nume' => 'Nae', 'prenume' => 'Ionel', 'sex' => 'm', 'varsta' => 27),
            'e3' => array('nume' => 'Noman', 'prenume' => 'Alice', 'sex' => 'f', 'varsta' => 22),
            'e4' => array('nume' => 'Geangos', 'prenume' => 'Bogdan', 'sex' => 'm', 'varsta' => 23),
            'e5' => array('nume' => 'Vasile', 'prenume' => 'Mihai', 'sex' => 'm', 'varsta' => 25)
);
如果您想查看此stdClass对象,只需调用此方法。
print_r($clasa);

如果您想将一个数组转换为对象,则代码将是

$arr = array('a'=>'apple','b'=>'ball');
$arr = (object) $arr;

您不需要使用stdClass。它会自动转换为stdClass


27
无法处理嵌套数组。 - Thamaraiselvam
你需要递归地对嵌套的数组进行转换,参见下面 @darleys 的回答。 - farinspace
尝试这种嵌套数组的方法:$class = (object) [ 'e1' => (object) ['num' => 'Nitu', 'sex' => 'm'], 'e2' => (object) ['num' => 'Nae', 'sex' => 'm'] ] - Khyam Shahzad

71

一种快速且简单的方式是使用json_encodejson_decode 函数,这将把整个数组(包括子元素)转换为一个对象。

$clasa = json_decode(json_encode($clasa)); //Turn it into an object

可以使用同样的方法将一个对象转换为数组。只需在json_decode中添加, true即可返回一个关联数组:

$clasa = json_decode(json_encode($clasa), true); //Turn it into an array

另一种(不使用脏代码)方法是使用递归函数:

function convertToObject($array) {
    $object = new stdClass();
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $value = convertToObject($value);
        }
        $object->$key = $value;
    }
    return $object;
}

或者完整的代码:
<?php
    function convertToObject($array) {
        $object = new stdClass();
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $value = convertToObject($value);
            }
            $object->$key = $value;
        }
        return $object;
    }

    $clasa = array(
            'e1' => array('nume' => 'Nitu', 'prenume' => 'Andrei', 'sex' => 'm', 'varsta' => 23),
            'e2' => array('nume' => 'Nae', 'prenume' => 'Ionel', 'sex' => 'm', 'varsta' => 27),
            'e3' => array('nume' => 'Noman', 'prenume' => 'Alice', 'sex' => 'f', 'varsta' => 22),
            'e4' => array('nume' => 'Geangos', 'prenume' => 'Bogdan', 'sex' => 'm', 'varsta' => 23),
            'e5' => array('nume' => 'Vasile', 'prenume' => 'Mihai', 'sex' => 'm', 'varsta' => 25)
    );

    $obj = convertToObject($clasa);
    print_r($obj);
?>

输出的结果如下(注意,没有数组——只有 stdClass):

stdClass Object
(
    [e1] => stdClass Object
        (
            [nume] => Nitu
            [prenume] => Andrei
            [sex] => m
            [varsta] => 23
        )

    [e2] => stdClass Object
        (
            [nume] => Nae
            [prenume] => Ionel
            [sex] => m
            [varsta] => 27
        )

    [e3] => stdClass Object
        (
            [nume] => Noman
            [prenume] => Alice
            [sex] => f
            [varsta] => 22
        )

    [e4] => stdClass Object
        (
            [nume] => Geangos
            [prenume] => Bogdan
            [sex] => m
            [varsta] => 23
        )

    [e5] => stdClass Object
        (
            [nume] => Vasile
            [prenume] => Mihai
            [sex] => m
            [varsta] => 25
        )

)

因此,您可以通过 $obj->e5->nume 来引用它。 示例

它已经是一个数组了,为什么你还需要再次将它转换成数组呢? - Amal Murali
很棒,但根据我所读的,这个解决方案执行起来更或多或少地较慢。 - Alexandrw
2
@AmalMurali 这是为了补充一下,这可以用于将数组->对象对象->数组进行转换。再次阅读帖子:同样可以用来将对象转换为数组 - h2ooooooo
5
这种解决方案 json_decode(json_encode($clasa)) 相对于只使用 (object) 将数组转换为对象的好处在于,后者不会递归地进行转换,因此任何内部数组仍将保留为数组。 - racl101
我讨厌人们只是选择看起来更容易的选项,而不是接受正确的选项。这个代码几乎完成了,并展示了两种方法,比简单的类型转换好得多。 - zakius
显示剩余2条评论

24

如果您想将整个数组递归地转换为对象类型(stdClass),那么以下是最佳方法,而且不会占用太多时间或内存,尤其是在进行递归(多级)转换时,与编写自己的函数相比。

$array_object = json_decode(json_encode($array));

1
似乎仍然没有将所有的数组转换完成。 - Ingus

19

最简单的解决方案之一是

$objectData = (object) $arrayData

无法处理嵌套数组。它们仍将是数组,而不是 stdClass - Vladislav Rastrusny

8
要使用stdClass将数组转换为对象,只需在声明的数组中添加(object)即可。
例如:
echo $array['value'];
echo $object->value;

将对象转换为数组

$obj = (object)$array;

将数组转换为对象。
$arr = (array)$object

使用这些方法,您可以轻松地在数组和对象之间进行交换。


另一种方法是使用 json。

$object = json_decode(json_encode($array), FALSE);

但这种方法的内存消耗较大,不支持PHP版本<=5.1。


4
在PHP中,可以通过以下方式将数组转换为stdClass。(stdClass已经是PHP的通用空类)
$a = stdClass:: __set_state(array());

实际上,在PHP 5中调用stdClass::__set_state()会产生致命错误。感谢@Ozzy指出。

这是一个示例,展示如何在PHP5中使用__set_state()与stdClass对象配合使用。

class stdClassHelper{

    public static function __set_state(array $array){
        $stdClass = new stdClass();
        foreach ($array as $key => $value){
           $stdClass->$key = $value;
        }
        return $stdClass;
    }
}

$newstd = stdClassHelper::__set_state(array());

或者更加友好的方式。
$a = (object) array();

不支持嵌套数组。 - Vladislav Rastrusny

3
或者您可以使用这个东西。
$arr = [1,2,3];
$obj = json_decode(json_encode($arr));
print_r($obj);

2

使用这个教程

<?php
function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    }

    function arrayToObject($d) {
        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return (object) array_map(__FUNCTION__, $d);
        }
        else {
            // Return object
            return $d;
        }
    }

        // Create new stdClass Object
    $init = new stdClass;

    // Add some test data
    $init->foo = "Test data";
    $init->bar = new stdClass;
    $init->bar->baaz = "Testing";
    $init->bar->fooz = new stdClass;
    $init->bar->fooz->baz = "Testing again";
    $init->foox = "Just test";

    // Convert array to object and then object back to array
    $array = objectToArray($init);
    $object = arrayToObject($array);

    // Print objects and array
    print_r($init);
    echo "\n";
    print_r($array);
    echo "\n";
    print_r($object);


//OUTPUT
    stdClass Object
(
    [foo] => Test data
    [bar] => stdClass Object
        (
            [baaz] => Testing
            [fooz] => stdClass Object
                (
                    [baz] => Testing again
                )

        )

    [foox] => Just test
)

Array
(
    [foo] => Test data
    [bar] => Array
        (
            [baaz] => Testing
            [fooz] => Array
                (
                    [baz] => Testing again
                )

        )

    [foox] => Just test
)

stdClass Object
(
    [foo] => Test data
    [bar] => stdClass Object
        (
            [baaz] => Testing
            [fooz] => stdClass Object
                (
                    [baz] => Testing again
                )

        )

    [foox] => Just test
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接