Как я могу перебрать массив stdObject, не вызывая PHP уведомлений / предупреждений?

У меня есть следующий stdObject, полученный через cURL / json_decode():

stdClass Object
(
    [response] => stdClass Object
        (
            [status] => OK
            [num_elements] => 1030
            [start_element] => 0
            [results] => stdClass Object
                (
                    [publisher] => stdClass Object
                        (
                            [num_elements] => 1030
                            [results] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [id] => 1234
                                            [weight] => 4444
                                            [name] => Pub 1
                                            [member_id] => 1
                                            [state] => active
                                            [code] => 
                                        )

                                    [1] => stdClass Object
                                        (
                                            [id] => 1235
                                            [weight] => 4444
                                            [name] => Pub 2
                                            [member_id] => 2
                                            [state] => active
                                            [code] => 
                                        )

                                )

                        )

                )

            [dbg_info] => stdClass Object
                (
                    [instance] => instance1.server.com
                    [slave_hit] => 1
                    [db] => db1.server.com
                    [reads] => 3
                    [read_limit] => 100
                    [read_limit_seconds] => 60
                    [writes] => 0
                    [write_limit] => 60
                    [write_limit_seconds] => 60
                    [awesomesauce_cache_used] => 
                    [count_cache_used] => 
                    [warnings] => Array
                        (
                        )

                    [time] => 70.440053939819
                    [start_microtime] => 1380833763.4083
                    [version] => 1.14
                    [slave_lag] => 0
                    [member_last_modified_age] => 2083072
                )

        )

)

Я перебираю его, чтобы получить идентификатор каждого результата:

foreach ($result->response->results->publisher->results as $object) {
    $publishers .= $object->id.",";
}

И хотя код работает нормально, PHP выдает следующие уведомления / предупреждения:

Примечание PHP: попытка получить свойство необъекта в /var/www/vhosts/domain.net/script.php в строке 1 Примечание PHP: попытка получить свойство необъекта в / var / www / vhosts / domain.NET / script.php в строке 1 Предупреждение PHP: неверный аргумент указан для foreach() в /var/www/vhosts/domain.net/script.php в строке 1

Есть идеи? Заранее спасибо!

1 ответ

Решение

Возможно, вы установили второй параметр $assoc в json_decode() для true? Как это:

$result = json_decode($json_from_curl, true);

Таким образом, возвращается $result со всеми объектами stdClass, преобразованными в ассоциативный массив.

РЕДАКТИРОВАТЬ: Если $result вы получаете действительно ассоциативный массив, тогда мы должны рассматривать его как таковой. Попробуйте заменить ваш foreach с этим:

foreach ($result['response']['results']['publisher']['results'] as $arr) {
    $publishers .= $arr['id'] . ",";
}

EDIT2: из моего собственного тестирования на основе вашего кода, все должно работать правильно. Уведомления / предупреждения не должны появляться. Возможно, причиной этого является какой-то другой код, не показанный в вашем вопросе.

Другие вопросы по тегам