2016-05-30 4 views
2

, являющийся полным «noob» для php, я пытаюсь прочитать данные из json-файла с вложенными массивами. Вот что мне удалось достичь до сих пор. JSON:PHP-цикл через вложенный массив 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> 

С помощью этого кода можно отобразить данные в <H2> и <span> правильно, но «URL» одинаково для каждого ... Что бы быть правильным способом получить это? Большое спасибо заранее - это, вероятно, очень очевидно, но любая помощь очень ценится!

ответ

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> 

So деятельность является вашим первым массивом и каждая операция содержит массив с Parcs, где вы также должны циклом по каждому элементу.

В текущем решении, вы выберите первый Парк в каждом цикле, в то время как итерация по каждому виду деятельности: $obj['parcs']['0']['nom'], но 0 остается 0 в каждом цикле, это причина, почему вы видите только первый PARC.

Parcs также является массивом, поэтому вы должны также перебирать эти элементы, как и с действиями.

+0

Большое спасибо Эрик! Я дам ему попробовать :) – benp

+0

Отлично, он работает! :) Я только должен был добавить отсутствующий '?>', Где начинается второй цикл. Просто из любопытства, почему вы говорите, что это «не очень приятно»? Я полагаю, что может быть более эффективный способ сделать это? Еще раз спасибо. – benp

+0

Вначале я подумал, что может быть более приятный способ сделать это, но в вашем случае это прекрасно, я думаю. Замечательно, что это работает. –

Смежные вопросы