在PHP中访问多维OBJECT中的值的正确方法是什么

问题描述 投票:2回答:4

我有一个像下面的对象

stdClass Object
(
    [0] => stdClass Object
        (
            [className] => stdClass Object
                (
                    [attribute] => stdClass Object
                        (
                            [name] => Aabir Hussain
                            [phone] => 9555555985
                            [email] => [email protected]
                            [create_on] => 12-10-2016 12:12:12
                            [status] => Active
                        )

                    [validationMessage] => stdClass Object
                        (
                            [name] => no_error
                            [phone] => no_error
                            [email] => Email Already Taken, Please Choose Another One
                            [create_on] => no_error
                            [status] => no_error
                        )

                    [scenario] => create
                )

        )

)

我想获得名称的价值而不使用foreach或for循环

我已经尝试了this link,他们已经给出了不同的方法来从像下面的对象获取值。但没有什么对我有用。

print_r($arrayMultiIndex[0]); //not working because it is not an array;
print_r($arrayMultiIndex{0}); //not working
print_r($arrayMultiIndex->0); //not working

我使用的是PHP 7.0.9

编辑

print_r($arrayMultiIndex->{0}); //also not working or
echo $arrayMultiIndex->{0}->className->attribute->name //not working

编辑Php Fiddle php fiddle link

php oop object
4个回答
1
投票

可能以下链接可以帮助你

How to access object properties with names like integers?

基本上,对象属性访问的Curly-brace语法不适用于全数字键。

或者不是简单地对类型进行类型转换,而是使用我修改的函数arraytoobject版本。这仅适用于您的特定需求。我将密钥转换为字符串,否则将无法访问。

$arrayMultiIndex = [
     [
    'className' => [
        'attribute' => [
            'name' => 'Aabir Hussain',
            'phone' => 955585,
            'email' => '[email protected]',
            'create_on' => '12-10-2016 12:12:12',
            'status' => 'Active'
        ],
        'validationMessage' => [
            'name' => 'no_error',
            'phone' => 'no_error',
            'email' => 'Email Already Taken, Please Choose Another One',
            'create_on' => 'no_error',
            'status' => 'no_error'
        ],
        'scenario' => 'create',
    ] 
]
];
$arrayMultiIndexObject = arrayToObjectNew($arrayMultiIndex);
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;
    }
}
function arrayToObjectNew($array) {
if (!is_array($array)) {
    return $array;
}


if (is_array($array) && count($array) > 0) {
    foreach ($array as $name=>$value) {

        $object = new stdClass();
        if(is_numeric($name))
            $name = (string) $name;

        $name = strtolower(trim($name));
        // if (!empty($name)) {
            $object->$name = arrayToObject($value);
        // }
    }
    return $object;
}
else {
    return FALSE;
}
}

echo '<pre>'; print_r($arrayMultiIndexObject->{0}); die;

0
投票

如果您不想使用foreach和for循环,那么将此对象转换为数组并过滤掉'name'属性值并以正常方式访问它,如$ arr [0],$ arr [1],...即代码给出下面没有使用foreach和for循环然后获取name属性值..

//Converting object into array
$arrayMultiIndex_arr = json_decode(json_encode($arrayMultiIndex), TRUE);

//Filtering out name property value from array
$name_array = array_column(array_reduce(array_reduce($arrayMultiIndex_arr, 'array_merge', array()), 'array_merge', array()), "name");

print_r($name_array);

0
投票

当我搜索到处时,我找不到任何可行的解决方案,但我可以给你一个建议,将对象转换为数组。

$arrayMultiIndex = (array)$arrayMultiIndex;
echo $arrayMultiIndex[0]['className']['attribute']['name'];

这段代码的Online Example

请阅读here...的一大堆答案


0
投票

$ name = reset($ arrayMultiIndex) - > className-> attribute-> name;

echo $ name;

© www.soinside.com 2019 - 2024. All rights reserved.