如何使用对象语法通过数组遍历对象?

时间:2018-09-11 13:13:46

标签: php arrays object

我想使用对象语法-foreach .. $ prop-> val遍历我的对象,但是我得到一个错误,它不是对象。

这是我的对象:

stdClass Object
(
    [calls] => Array
        (
            [0] => stdClass Object
                (
                    [employee_id] => 47
                    [call_duration] => 10
                )

            [1] => stdClass Object
                (
                    [employee_id] => 47
                    [call_duration] => 10
                )

            [2] => stdClass Object
                (
                    [employee_id] => 47
                    [call_duration] => 137
                )

它是这样创建的:

$all_calls->calls[] = [
   'employee_id' => $employee_id,
   'call_duration'  => $value->duration
];

如何不使用数组语法$ call [“ employee_id”]而是使用$ call-> employee_id来遍历“调用”?

3 个答案:

答案 0 :(得分:1)

根据创建调用数组的方式,可以执行此操作以遍历调用并将它们用作对象:

foreach($all_calls->calls as $call) {
    $call = (object)$call; // cast the array as an object
    $employeeId = $call->employee_id;
}

在第2行,关联数组将转换为具有由键和相应值命名的属性的对象

参考此处:http://php.net/manual/language.types.object.php

答案 1 :(得分:1)

因为实际上没有数组对象,但是在执行时却有 key => value 对的数组

$all_calls->calls[] = [
   'employee_id' => $employee_id,
   'call_duration'  => $value->duration
];

您当然不能将成员作为对象访问。

您可以在获取对象时将 key => value 数组强制转换为对象,但这是更正确的选择,尤其是如果您希望整个对象结构看起来像您的示例是从一开始就将 stdClass 的实例而不是 key => value 对数组添加到$calls数组中。否则,您的对象仍将包含您要使用的 key => value 对数组。

您可以做类似

的操作
$c = new stdClass();
$c->employee_id = 10;
$c->call_duration = 60;
$obj->calls[] = $c

但是要使其更紧凑并且不必键入太多,您可以执行类似的操作。

$obj->calls[] = (object)['employee_id' => 10, 'call_duration' => 42];

这将使您的$calls成员变量包含 stdClass对象的实例,可以通过-> 访问其成员。

通过以json格式存储初始数据并进行类似于{p>的jsondecode

$obj->calls[] = json_decode('{ "employee_id ": 10, "call_duration": 60 }');

但是其他解决方案对我来说更清楚了。

答案 2 :(得分:0)

[已编辑] 我做了你提到的同样的事情,对我来说很好;

检查以下代码。

<?php
$all_calls = new stdClass;

$all_calls->calls = [
    (object)['employee_id' => 47, 'call_duration'  => 10],
    (object)['employee_id' => 47, 'call_duration'  => 10],
    (object)['employee_id' => 47, 'call_duration'  => 137],
];

echo "<pre>";
print_r($all_calls);


foreach($all_calls->calls as $call) {
    $employee_id = $call->employee_id;
}