【问题标题】:PHP looping through nested json arrayPHP循环遍历嵌套的json数组
【发布时间】:2016-05-30 17:54:56
【问题描述】:

作为 php 的完整“菜鸟”,我正在尝试从具有嵌套数组的 json 文件中读取数据。这是我迄今为止能够实现的目标。 json:

{
"activites": [
    {
        "nom": "Observation des oiseaux",
        "image": "http://cdn2.gossipcenter.com/sites/default/files/imagecache/story_header/photos/tom-cruise-020514sp.jpg",
        "description": "Sed id eros nec orci elementum auctor at vitae tortor. Pellentesque eget nibh sed justo consequat suscipit. Nunc augue sem, porta non molestie sed, volutpat quis orci. Curabitur in erat eu nibh fermentum volutpat vitae ut nisi. Nullam vitae euismod mauris. Suspendisse pretium facilisis gravida. Duis magna arcu, pharetra in sapien eu, ornare vehicula arcu.",
        "parcs": [
            {
                "nom": "Nom du parc 1",
                "url": "url-du-parc-1.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            },
            {
                "nom": "Nom du parc 2",
                "url": "url-du-parc-2.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            },
            {
                "nom": "Nom du parc 3",
                "url": "url-du-parc-3.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            },
            {
                "nom": "Nom du parc 4",
                "url": "url-du-parc-3.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            }
        ]
    },
    {
        "nom": "Pétanque",
        "image": "http://cdn2.gossipcenter.com/sites/default/files/imagecache/story_header/photos/tom-cruise-020514sp.jpg",
        "description": "Sed id eros nec orci elementum auctor at vitae tortor. Pellentesque eget nibh sed justo consequat suscipit. Nunc augue sem, porta non molestie sed, volutpat quis orci. Curabitur in erat eu nibh fermentum volutpat vitae ut nisi. Nullam vitae euismod mauris. Suspendisse pretium facilisis gravida. Duis magna arcu, pharetra in sapien eu, ornare vehicula arcu.",
        "parcs": [
            {
                "nom": "Nom du parc 1  pour deuxième activité",
                "url": "url-du-parc-1.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            },
            {
                "nom": "Nom du parc 2 pour deuxième activité",
                "url": "url-du-parc-2.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            }
        ]
    },
    {
        "nom": "Nom de l'activité 3",
        "image": "http://cdn2.gossipcenter.com/sites/default/files/imagecache/story_header/photos/tom-cruise-020514sp.jpg",
        "description": "Sed id eros nec orci elementum auctor at vitae tortor. Pellentesque eget nibh sed justo consequat suscipit. Nunc augue sem, porta non molestie sed, volutpat quis orci. Curabitur in erat eu nibh fermentum volutpat vitae ut nisi. Nullam vitae euismod mauris. Suspendisse pretium facilisis gravida. Duis magna arcu, pharetra in sapien eu, ornare vehicula arcu.",
        "parcs": [
            {
                "nom": "Nom du parc 1  pour troisième activité",
                "url": "url-du-parc-1.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            },
            {
                "nom": "Nom du parc 2 pour troisième activité",
                "url": "url-du-parc-2.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            },
            {
                "nom": "Nom du parc 3 pour troisième activité",
                "url": "url-du-parc-2.html",
                "location":
                    {
                        "latitude": "44.7789990",
                        "longitude": "67.9988990"
                    }
            }
        ]
    }
]
}

和 php:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="">
  <title></title>
  <link href="assets/css/styles.css" rel="stylesheet">
  <!--[if IE]>
  <link rel="stylesheet" type="text/css" href="assets/css/ie.css" />
  <![endif]-->
</head>
<body>
  <?php
$json_url = "./assets/js/activites.json";
$json = file_get_contents($json_url);
$stuff = json_decode($json, true);
?>
  <div class="toto">
    <?php
    foreach($stuff['activites'] as $obj){
?>
    <h2>
      <?php echo $obj['nom'] ?></h2>
    <a href="<?php echo $obj['parcs']['0']['url'] ?>
      ">
      <span>
        <?php echo $obj['parcs']['0']['nom'] ?></span>
    </a>
    <?php
    }
?></div>
</body>
</html>

使用此代码,我可以正确显示&lt;H2&gt;&lt;span&gt; 中的数据,但每个“url”都是相同的......获得它的正确方法是什么? 非常感谢 - 这可能很明显,但非常感谢任何帮助!

【问题讨论】:

    标签: php arrays json


    【解决方案1】:

    这应该给你一个想法。不是很好,但它应该工作。问题是您只迭代第一级(活动)。您还应该遍历第二层(parcs)。所以你应该至少有两个 foreach 循环:

     <div class="toto">
        <?php
        foreach($stuff['activites'] as $obj){ // over here you iterate over the first level ?>
    
          <h2><?php echo $obj['nom']; ?></h2>
    
          <?php foreach($obj['parcs'] as $parc){ // this is the second level array, the parcs
    
             <a href="<?php echo $parc['url']; ?>">
                 <span><?php echo $parc['nom']; ?></span>
             </a>
    
        <?php
          }
        }
    ?></div>
    

    所以活动是你的第一个数组,每个活动都包含一个带有 parcs 的数组,你还应该循环遍历每个元素。

    在您当前的解决方案中,您确实选择了每个循环中的第一个 parc,同时迭代每个活动:$obj['parcs']['0']['nom'],但 0 在每个循环中保持 0,这就是您只看到第一个的原因帕克

    Parcs 也是一个数组,因此您也应该迭代这些元素,就像您对活动所做的那样。

    【讨论】:

    • 非常感谢埃里克!我试试看:)
    • 太好了,它有效! :) 我只需要在第二个循环开始的地方添加一个缺少的?&gt;。只是出于好奇,你为什么说它“不太好”?我想可能有更有效的方法来做到这一点?再次感谢。
    • 好吧,起初我认为可能有更好的方法来做到这一点,但在你的情况下,我猜这很好。很高兴听到它有效。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2016-11-17
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多