Массив объектов PHP - проверьте, существует ли ключ массива

У меня есть следующий массив объектов, возвращенный из вызова мыла:

$result = $this->soapClient->__soapCall($method, $arguments);

var_dump($result);


object(stdClass)#4 (1) {
    ["Jobs_GetResult"]=> object(stdClass)#5 (3) {
        ["Jobs"]=> array(4) {
              [0]=> object(stdClass)#7 (19) {
                    ["JobID"]=> int(55082846)
                    ["JobName"]=> string(18) "Fix xyz"
              } 

        }
        ["Errors"]=> object(stdClass)#10 (2) {
             ["Result"]=> int(0)
             ["Message"]=> string(0) "" 
        }
        ["RecordCount"]=> int(1) 
    }
}

Я хочу проверить, есть ли какие-либо ошибки - это легко, когда известен ключ родительского массива, например:

if ($result->Jobs_GetResult->Errors->Result > 0){
     // display message
}

Проблема в том, что я не знаю, какое имя будет иметь ключ массива верхнего уровня для большинства вызовов, поскольку я использую общий метод - в приведенном выше примере это Jobs_GetResult, поэтому все вышесказанное будет работать.

В случаях, когда ключ массива верхнего уровня неизвестен, как мне проверить, нет ли возвращенных ошибок?

Как правило, имя ключа родительского массива - это обычно имя вызова метода с добавленным к нему Result. поэтому я думал сделать что-то вроде:

 if ($result->$method . 'Result'->Errors->Result > 0){
     // display message
 }

Но очевидно, что приведенный выше синтаксис неверен. Любой знает, как вывести значение $method и связать его с $result и добавить его с помощью Result.

Есть ли другой способ проверить, больше ли результат массива ошибок 1, не зная, что такое ключ родительского массива?

Может быть, с этой работой справится простой foreach? Если сделать foreach($result as $key => $value) {} можно получить ошибку в $value->Errors->Result нет?

Mickaël Leger 18.10.2018 14:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
894
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

$result = $this->soapClient->__soapCall($method, $arguments);

$firstKey = key($result);

if (!empty($firstKey) && !empty($result->{$firstKey}->Errors->Result)) {
    // display message
}

Можете ли вы использовать key() на объекте? По инструкции не похоже.

jeroen 18.10.2018 14:14

Сначала вы можете преобразовать объект Std в массив, тогда он будет работать так, как вы ожидаете.

Ryan Vincent 18.10.2018 14:15

@jeroen На самом деле вам не нужно использовать его, просто попробовал его на объекте, и он работает. Я тоже был настроен скептически

RiggsFolly 18.10.2018 14:15

@RiggsFolly Nice, я этого не знал. Просто попробовал сам :-)

jeroen 18.10.2018 14:18

Если вы настроены скептически, просто приведите $ result к массиву: $firstKey = key((array)$result);

odan 18.10.2018 14:20

Даниэль: Я был настроен скептически и поэтому проверил это. Как только я обнаружил, что это сработало, я проголосовал за ваш ответ.

RiggsFolly 18.10.2018 14:26

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