【问题标题】:Iterate through multidimensional object/array遍历多维对象/数组
【发布时间】:2019-11-14 21:39:45
【问题描述】:

我有一些来自soap api的数据。此数据采用以下格式:

array(2) {
  ["Request"]=>
  object(stdClass)#7 (3) {
    ["AccessKey"]=>
    string(3) "dub"
    ["Timestamp"]=>
    string(19) "2019.07.04 09:06:19"
    ["Conditions"]=>
    object(stdClass)#8 (1) {
      ["Condition"]=>
      object(stdClass)#9 (2) {
        ["Field"]=>
        string(11) "From"
        ["Value"]=>
        string(10) "1562223979"
      }
    }
  }
  ["Products"]=>
  object(stdClass)#10 (1) {
    ["Product"]=>
    array(10) {
      [0]=>
      object(stdClass)#11 (11) {
        ["Ean"]=>
        string(13) "4029759107323"
        ["Type"]=>
        string(9) "DVD"
        ["Title"]=>
        string(58) "Hellraisers"
        ["FSK"]=>
        string(36) "Freigegeben ohne Altersbeschränkung"
        ["Genre"]=>
        string(5) "Sport"
        ["Year"]=>
        string(4) "2015"
        ["Length"]=>
        string(3) "275"
        ["Language"]=>
        string(7) "Deutsch"
        ["Items"]=>
        string(1) "2"
        ["Release"]=>
        string(10) "2049-12-31"
        ["Label"]=>
        string(17) "Edel Germany GmbH"
      }

我想遍历这些数据并获取每个集合的标题。

我尝试了一个 foreach 循环,但我收到了一些错误消息。

foreach ($results as $result) {
    echo "Titel " . $result->Titel;
}

foreach ($results as $result) {
    echo "Titel " . $result['Product']->Titel;
}

没有任何作用。我无法将头绕在数组周围...

【问题讨论】:

  • Titel 你的意思是Title?正如您希望该示例的输出将是“Hellraisers”?
  • 因为数据看起来好像在另一个元素下 - 最后尝试foreach ($results['Products'] as $result) {。 (连同正确的拼写)。
  • 结果数组中的 2 个对象看起来非常不同。我认为循环不是获得这些结果的最佳方式。
  • 感谢您的快速回复! @Nigel当我尝试这个时,我得到致命错误:未捕获的错误:无法使用stdClass类型的对象作为/opt/lampp/htdocs/api_test/index.php中的数组:39堆栈跟踪:在/opt中抛出#0 {main} /lampp/htdocs/api_test/index.php 第 39 行
  • @Dirk 我还能尝试什么其他方法?

标签: php arrays object soap iteration


【解决方案1】:

当您没有掌握某些东西时,有时最好尝试将其缩小并从那里扩展,开始尝试打印整个响应,然后是属性产品,然后是产品,然后是产品数组:

如何到达$response里面的products数组

首先你有一个对象$response里面有元素,["Products"]是我们想要的,所以$response->Products然后在["Products"]里面有一个对象,有一个名为["Product"]的属性包含所有产品的对象数组,所以$response>Products->Product。由于$response->Products->Product 是一个我们需要对其进行迭代的数组,因此您可以这样迭代:

foreach($response->Products->Product as $product){
 echo $product->Title; // prints the title of every product
}

如果您不明白或者它不起作用,请不要犹豫,但是根据您粘贴的代码,我认为foreach 是正确的。

How to access a property of an object (stdClass Object) member/element of an array? [duplicate]

JSON 格式建议

顺便说一句,JSON 不是“清晰”和“正确”的,产品数组应该是上一层。在“产品”内,而不是在“产品”内。

【讨论】:

  • 嘿何塞普!非常感谢您对过程的良好解释。它有助于我更好地理解它。当我尝试您的方法时,我收到此错误消息:致命错误:未捕获的错误:无法使用 stdClass 类型的对象作为 /opt/lampp/htdocs/api_test/index.php:39 中的数组的对象堆栈跟踪:#0 {main} 已抛出在第 39 行的 /opt/lampp/htdocs/api_test/index.php 如果尝试将产品作为对象($response->Products['Product'] 我得到相同的消息我只是从 api 获取数据,我没有写我自己。这是我从中得到的 JSON
  • @youwhatmate 试试echo $product->Title,而不是 echo $product['Title']; .如果它不起作用,请使用下一个代码foreach($response["Products"]->Product as $product){ echo $product->Title; // prints the title of every product }
  • 好的,经过一些试验和错误,我得到了结果 :-) foreach($response->Products->Product as $product) { echo $product->Title 。 "
    "; }
  • @youwhatmate 因为你没有放整个代码我不知道主数组也是一个对象,我会编辑代码,标记为正确,谢谢!
  • 对不起!我把你的答案标记为正确的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2015-09-26
  • 1970-01-01
相关资源
最近更新 更多