Доступ к многоуровневому объектному полю стандартного класса?

#php #arrays #object #soap #stdclass

#php #массивы #объект #soap #стандартный класс

Вопрос:

Я получил этот смехотворно сложный массив объектов в качестве ответа SOAP. Мне нужно распечатать «string_operator_collection» с помощью цикла. Это набор операторов, похожих на [«equal_wild»], но со всеми разными именами. Вложенность настолько глубока, что я не могу получить доступ с помощью обычных методов. Какие-нибудь идеи, пожалуйста?

 object(stdClass)#2 (1) { 
["get_search_frame_details_response"]
=> object(stdClass)#3 (2) { 
    ["response_context"]=> object(stdClass)#4 (3) { 
        ["session_token"]
        => string(28) "b0ac045931183d1ead6b9f6da061" 
        ["response_status"]=> string(2) "OK" 
        ["response_message"]=> string(0) "" } 
            ["search_frame_details_response_data"]
            => object(stdClass)#5 (2) { 
                ["search_field_collection"]=> object(stdClass)#6 (1) { 
                    ["search_field"]=> array(4) { 
                    [0]=> object(stdClass)#7 (3) { 
                        ["field_id"]
                        => string(82) 
                        "OsCashAllocationCashAllocationPk" 
                        ["field_name"]=> string(15) "Customer Number" 
                        ["field_operator"]
                        => object(stdClass)#8 (1) { 
                            ["string_operator_collection"]
                            => object(stdClass)#9 (16) { 
                                ["equal_wild"]=> string(2) "=*"
  

Мои лучшие усилия на данный момент:

 get_search_frame_details_response->
  search_frame_details_response_data->
    search_field_collection->search_field;

    print_r(array_values($search_frame_op1));
  

Комментарии:

1. Конечно, вы можете использовать normal methods !!!! Вам просто нужно потратить некоторое время на его разработку

2. Я лично считаю print_r() , что вывод легче отслеживать, попробуйте это, опубликуйте его, если вы все еще не можете с этим справиться

3. Отступ, с которым он размещен здесь, является диким. Это очень затрудняет визуальный анализ. Если вы загружаете это в браузер с var_dump() помощью, просмотрите исходный код страницы и скопируйте его точно так, как он там отображается. print_r() будет немного менее шумным и более удобным для чтения.

4. Извините, мне пришлось отформатировать его, чтобы соответствовать правилам переполнения стека. @RiggsFolly Я пробовал print_r, и это понятнее. Я уже несколько часов перепробовал так много разных комбинаций.

5. Как я уже сказал, с этим отступом действительно сложно определить, но, похоже $var->get_search_frame_details_response->search_frame_details_response_data->search_field_collection->search_field[0]->field_operator->string_operator_collection->equal_wild , наращивайте его постепенно и print_r() на каждом шаге, чтобы убедиться, что вы правильно сужаете его.

Ответ №1:

Я думаю (отображение не помогает) string_operator_collection , адрес

 $obj
->get_search_frame_details_response
->search_frame_details_response_data
->search_field_collection
->search_field[]
->field_operator
->string_operator_collection
->equal_wild
  

Так как массив начинается с

 $obj
->get_search_frame_details_response
->search_frame_details_response_data
->search_field_collection
->search_field[];
  

мы можем написать цикл, подобный этому

 $the_array =  $obj
                ->get_search_frame_details_response
                ->search_frame_details_response_data
                ->search_field_collection
                ->search_field;  

foreach($the_array as $field ) {
    echo $field
            ->field_operator
            ->string_operator_collection
            ->equal_wild;
}
  

Комментарии:

1. В будущем я постараюсь форматировать так же хорошо, как и вы. Ваш ответ блестящий. Вы проводите какие-либо консультации? Лучший ответ.

2. @RobertMorel Если вы спрашиваете, могу ли я работать на временной основе, ответ — ДА

3. Потрясающе, я буду ждать от вас ответа.

Ответ №2:

Использование цикла:

 function findInCollection($collection, $fieldToFind){
    foreach($collection as $key => $subCollection) {
        if ($key == $fieldToFind) {
            return $subCollection;
        }

        if ( ! is_object($subCollection)) {
            return null;
        }

        return findInCollection($subCollection, $fieldToFind);
    }
}
  

Но помните, что у вас могут возникнуть действительно серьезные проблемы, если ключевая доза не существует.

Комментарии:

1. Спасибо, но в данном конкретном случае это работает не слишком хорошо.