【问题标题】:Access a Multiple level stdClass object field?访问多级 stdClass 对象字段?
【发布时间】:2016-10-06 19:19:01
【问题描述】:

我收到了这个极其复杂的对象数组作为 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));

【问题讨论】:

  • 当然你可以使用normal methods!!!!你只需要花一些时间来解决它
  • 我个人觉得print_r() 的输出更容易理解,试试吧,如果仍然无法解决,请发布
  • 这里发布的缩进很疯狂。这使得视觉解析变得非常困难。如果您在浏览器中使用var_dump() 将其转储,请查看页面源并将其完全复制在那里。 print_r() 会少一点噪音,也更容易阅读。
  • 抱歉,我必须对其进行格式化以符合 Stack Overflow 规则。 @RiggsFolly 我试过 print_r ,它更清晰。几个小时以来,我已经尝试了很多不同的组合。
  • 就像我说的,用这个缩进真的很难分辨,但它看起来像$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() 每一步都确保你正确地缩小它。

标签: php arrays object soap stdclass


【解决方案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;
}

【讨论】:

  • 我以后会尽量像你一样格式化。你的回答太棒了。你做任何咨询吗?最佳答案。
  • @RobertMorel 如果你问我是否可以临时受雇,答案是肯定的
  • 太棒了,我会等你的消息。
【解决方案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);
    }
}

但请记住,如果不存在关键剂量,您可能会遇到非常棘手的问题。

【讨论】:

  • 谢谢,但在这种特殊情况下它并不能很好地工作。
猜你喜欢
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2010-11-22
  • 1970-01-01
  • 2013-10-17
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多