J'essaye de traverser un objet que j'obtiens sur openweather.com

Sans le foreach () j'obtiens le bon résultat. dans foreach () j'obtiens une erreur.

Le code php:

 $contents = file_get_contents($url); 
 $clima=json_decode($contents,TRUE);

 echo $clima['list'][5]['main']['temp'];  // this one works

 $i=0;
 foreach($clima['list'] as $clima1) {
     echo $clima1[$i]['dt'];   // here i get PHP Notice:  Undefined offset

     echo $clima1[$i]['main']['temp']; //here i get PHP Notice:  Undefined index: list

     $i=$i+1;
 }

L'erreur que j'obtiens est:

PHP Notice:  Undefined offset: 0   // the error is from 0 to 39 and there are 39 objects...
PHP Notice:  Undefined index: list 

La partie de début et de fin de l'objet pour l'échantillon:

Array ( [cod] => 200 [message] => 0.014 [cnt] => 40 [list] => 
Array ( [0] => Array ( [dt] => 1492732800 [main] => Array ( [temp] => 17.64 [temp_min] => 17.04 [temp_max] => 17.64 [pressure] => 1026.03 [sea_level] => 1031.21 [grnd_level] => 1026.03 [humidity] => 100 [temp_kf] => 0.6 ) [weather] => Array ( [0] => Array ( [id] => 800 [main] => Clear [description] => clear sky [icon] => 01n ) ) [clouds] => Array ( [all] => 0 ) [wind] => Array ( [speed] => 1.66 [deg] => 81.5008 ) [sys] => Array ( [pod] => n ) [dt_txt] => 2017-04-21 00:00:00 ) 
        [38] => Array ( [dt] => 1493143200 [main] => Array ( [temp] => 19.72 [temp_min] => 19.72 [temp_max] => 19.72 [pressure] => 1026.92 [sea_level] => 1032.02 [grnd_level] => 1026.92 [humidity] => 87 [temp_kf] => 0 ) [weather] => Array ( [0] => Array ( [id] => 800 [main] => Clear [description] => clear sky [icon] => 01n ) ) [clouds] => Array ( [all] => 0 ) [wind] => Array ( [speed] => 6.95 [deg] => 10.5008 ) [sys] => Array ( [pod] => n ) [dt_txt] => 2017-04-25 18:00:00 ) 
         [39] => Array ( [dt] => 1493154000 [main] => Array ( [temp] => 18.43 [temp_min] => 18.43 [temp_max] => 18.43 [pressure] => 1026.75 [sea_level] => 1031.91 [grnd_level] => 1026.75 [humidity] => 98 [temp_kf] => 0 ) [weather] => Array ( [0] => Array ( [id] => 800 [main] => Clear [description] => clear sky [icon] => 01n ) ) [clouds] => Array ( [all] => 0 ) [wind] => Array ( [speed] => 6.03 [deg] => 9.50076 ) [sys] => Array ( [pod] => n ) [dt_txt] => 2017-04-25 21:00:00 ) ) 
 [city] => Array ( [id] => **** [name] => ***** [coord] => Array ( [lat] => **.**** [lon] => **.**** ) [country] => ** ) )

Toute aide pour comprendre mon erreur sera appréciée

0
ic205 21 avril 2017 à 01:42

3 réponses

Meilleure réponse

Il semble que vous bouclez "double". Le compteur à l'intérieur de la boucle est la partie dont vous n'avez pas besoin, car vous bouclez déjà sur le tableau avec foreach.

Je pense que le code suivant serait la meilleure approche

 $contents = file_get_contents($url); 
 $clima=json_decode($contents,TRUE);

 echo $clima['list'][5]['main']['temp'];  // this one works

 foreach($clima['list'] as $clima1) {
     echo $clima1['dt'];   // here i get PHP Notice:  Undefined offset

     echo $clima1['main']['temp']; //here i get PHP Notice:  Undefined index: list
 }
1
Philipp 20 avril 2017 à 22:52

C'est parce que lorsque vous dépassez $clima['list'], vous obtiendrez toutes les valeurs dans $ clima ['list']. Par conséquent, d'abord, $clima1 = $clima['list'][0]. Après cela, $clima1 = $clima['list'][1] ... Ainsi, $ clima1 n'a ni 0 comme index ni 1 ni 2 ...

Voici ce que vous pourriez faire pour le voir plus clairement:

foreach($clima['list'] as $key => $clima1)

Et à chaque fois, la clé $ sera votre $ id. Par conséquent, vous pouvez vous débarrasser de votre $ id et le faire comme ceci:

foreach($clima['list'] as $id => $clima1)
1
Alex van Vliet 20 avril 2017 à 22:48

Lorsque vous exécutez foreach($clima['list'] as $clima1) { ..., chaque objet de la boucle ($clima1) est égal à $clima['list'][$i], vous n'avez donc pas besoin de mettre manuellement le $i dedans.

Si vous êtes vraiment coincé, je ferais juste la boucle comme:

foreach($clima['list'] as $clima1) {
    var_dump('<pre>' . $clima1 . '</pre>');
}

Pour voir ce qu'est réellement la variable $clima1.

1
100pic 20 avril 2017 à 22:49