Как перебрать объект с массивом с синтаксисом объекта? - PullRequest
0 голосов
/ 11 сентября 2018

Я хотел бы перебрать мой объект с синтаксисом объекта - 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 голосов
/ 11 сентября 2018

в зависимости от того, как вы создаете массив вызовов, вы можете сделать это для перебора ваших вызовов и использовать их в качестве объектов:

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

0 голосов
/ 11 сентября 2018

Поскольку на самом деле у вас нет массива объектов , а вместо этого массив пар 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 и выполнив jsondecode, аналогично

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

Но другое решение мне немного яснее.

0 голосов
/ 11 сентября 2018

[Отредактировано] Я создал тот же объект, который вы упомянули, и он отлично работает для меня;

проверьте код ниже.

<?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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...