【问题标题】:What is the correct way to access values in multi-dimensional OBJECT in PHP在 PHP 中访问多维 OBJECT 值的正确方法是什么
【发布时间】:2017-02-12 05:25:36
【问题描述】:

我有一个像下面这样的对象

stdClass Object
(
    [0] => stdClass Object
        (
            [className] => stdClass Object
                (
                    [attribute] => stdClass Object
                        (
                            [name] => Aabir Hussain
                            [phone] => 9555555985
                            [email] => aabir@gmail.com
                            [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

【问题讨论】:

  • 试试这个属性名echo $arrayMultiIndex->{0}->className->attribute->name
  • print_r($arrayMultiIndex->​​{0}); //不工作
  • 你需要一个配额:echo $arrayMultiIndex->{'0'}->className->attribute->name
  • 你的意思是这样 echo $arrayMultiIndex->​​{'0'}->className->attribute->name; .它也不起作用。给我这样的错误通知:未定义的属性:/opt/lampp/htdocs/practice/techgig_practice.php 中的 stdClass::$0 在第 116 行
  • 制作一个小提琴以便更好地检查......

标签: php oop object


【解决方案1】:

也许下面的链接可以帮助你

How to access object properties with names like integers?

基本上,对象属性访问的花括号语法不适用于全数字键。

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

$arrayMultiIndex = [
     [
    'className' => [
        'attribute' => [
            'name' => 'Aabir Hussain',
            'phone' => 955585,
            'email' => 'aabir@gmail.com',
            '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;

【讨论】:

  • 似乎我们无法访问这个索引,要么我们必须将其转换为数组,要么我们必须使用新的 stdClass 然后为其赋值。
  • 是的,这是正确的。我希望你通过简单的类型转换来创建这个对象?所以我建议获取一个关联的数组来做到这一点。
  • 是的,我已经用 typecasting 创建了这个对象。看看 fiddle,我使用 $jsonConversion = json_decode(json_encode($arrayMultiIndexJson)) 然后我可以 print_r($jsonConversion[0]);
  • 如果您只想使用该对象,请检查我的编辑。虽然这不是正确的编码标准,但根据您的要求,您可以使用 json_decode(json_encode($arrayMultiIndexJson)) 但这又是创建一个您不想要的数组。所以你可以使用我编辑中指定的方法。请检查。
  • 谢谢老兄。它不支持整数索引,因此将其转换为字符串是更好的选择。
【解决方案2】:

如果您不想使用 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);

【讨论】:

    【解决方案3】:

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

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

    Online Example 这段代码。

    请阅读完整的答案表格here...

    【讨论】:

    • 感谢您的回答。我知道我可以转换成数组然后轻松访问这个 $arrayMultiIndex[0]['className']['attribute']['name'];但这对我来说会很头疼,因为我总是要把它转换成一个数组。
    • 是的,我知道,问题出在您的对象上。否则,正如我之前所说/建议的那样,它将很容易访问。
    • 你看到小提琴了吗,我刚刚对数组进行了类型转换以使其成为对象。有人说不能访问,因为0是整数。
    • 是的,如果你创建了一个 stdClass,那么它很容易访问,但你已经对它进行了类型转换,所以现在不可能。
    【解决方案4】:

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

    回声 $name;

    【讨论】:

    • 尝试在代码周围添加更多细节以解释发生了什么。
    • @Toby 你投反对票是因为我没有说明 reset() 的工作原理吗?
    • 解释你的代码做什么总是有用的,而不是仅仅把代码放在那里希望人们理解。
    猜你喜欢
    • 2014-03-06
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多