访问多维stdClassObject-数组

时间:2019-05-24 07:39:22

标签: c# php arrays soap

我想访问从服务器作为SOAP响应获得的数组属性。我使用php soapclient并在使用时得到以下输出

$response = $client->$action($clientID);
$array = json_decode(json_encode($xml), True);

不幸的是,我无法访问'tid','answer'等属性。我该怎么做(我可以在导入结果的地方使用php或c#)

Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
            [0] => stdClass Object
                (
                    [tid] => 4103
                    [tdid] => 191
                    [qid] => 4103-1
                    [question] => Wie würden Sie Ihren Gesundheitszustand im Allgemeinen beschreiben ?
                    [answer] => Ausgezeichnet.
                    [score] => 100
                    [date] => 1558593404
                    [Fields] => Array
                        (
                        )

                )

            [1] => stdClass Object
                (
                    [tid] => 4103
                    [tdid] => 191
                    [qid] => 4103-2
                    [question] => Im Vergleich zum vergangenen Jahr, wie würden Sie Ihren derzeitigen Gesundheitszustand beschreiben ?
                    [answer] => Derzeit etwas besser als vor einem Jahr.
                    [score] => 75
                    [date] => 1558593404
                    [Fields] => Array
                        (
                        )

                )                                   

2 个答案:

答案 0 :(得分:0)

通过查看结果,您可以尝试一下吗?

// assuming $array is the array that you described

$tid = ($array[0])->tid;

因为$ array是一个对象数组,所以我假设获取数据就像使用属性访问器->一样简单。所以$ tid

您可以了解有关php对象here

的更多信息

希望有帮助!

-编辑-

它应该是($array[1][0])->tid。因为$ array [0]为空。您可以使用PHP的array_filter删除$ array中的所有空数组。

$filtered_array = array_filter($array, function($el){
  return count($el) > 0;
});

$filtered_array中只能包含非空数组。但请注意,array_filter保留了数组键。

然后,您可以使用foreach循环获取所有对象。

// say you want to put all tids in an array

$array_of_tids = [];
foreach($filtered_array as $array_of_objects){
  foreach($array_of_objects as $response_objects){
    $array_of_tids[] = $response_objects->tid;
  }
}

更简单但更不可靠(因为我不知道API响应的一致性),将仅使用索引。

$tid_of_first_object = ($array[1][0])->tid
// $tid_of_first_object would be '4103'

让我知道它是否仍然无法正常工作!

答案 1 :(得分:0)

您有一组对象数组,因此要访问它们,您需要使用$array[index/key][index/key]直到达到对象所在的级别,然后使用[]->进行访问。

您大概要循环遍历,因此在循环中您需要进行一些检查,例如is_arrayissetis_objectcount才能看到如果有任何事情要做,它将看起来像这样:

foreach($result as $arr) {
    if(count($arr) < 1) continue;//there are no entries in this array
    foreach($arr as $obj) {
      if(isset($obj->tid)) {
          //do your stuff
      }
    }
}

如果您只需要提示,则可以通过使用array_column提取所有数据来简化此操作,这取决于您的目标-但这应该为您设定正确的方向。您还可以根据需要查看array_map