8768 sujets

Développement web côté serveur, CMS

Bonjour,
Je récupère des données météo en JSON avec un lien URL sur un serveur distant.

Dans ce lien je peux changer un bout de code qui me permet de récupérer les données d'une autre ville. Je récupère toujours les mêmes données (vent, température, etc...) mais d'une autre ville.

Je ne cherche pas à faire une liste déroulante où je pourrais choisir la ville afin d'afficher la météo de cette ville.

Ce que je cherche à faire c'est que selon un critère que je choisi (par exemple, connaître toutes les ville où demain il aura de la pluie) et bien ma page web m'affiche toute les villes ou il y aura de la pluie.

Je peux retenir comme critère de m'afficher que la pluie mais je ne sais pas comment consulter plusieurs "code ville" à la fois pour savoir toutes les villes où y aura de la pluie demain ?

mon json ressemble à cela :
$json = file_get_contents("http://blablabla/?ville=15&pluie, temperature etc...

Le code de la ville est 15, et j'ai au moins 20 villes !

Comment puis je faire ?

Merci de votre aide
Salut Woubi,

As-tu accès à la page qui génère ton JSON ? Peux-tu modifier le code de cette page ou est-ce une page d'un service tiers ? Car c'est sur cette page que tu pourras agir pour générer un JSON avec les données que tu veux.

Peux-tu récupérer l'ensemble de la liste des villes répertoriées (la vingtaine d'IDs) ?

Il faudrait savoir comment fonctionne tes appels à ta page générant le JSON.
Salut MatthieuR,

merci pour cette réponse.

Oui, j'ai accès avec un code secret à la page qui génère ce JSON.
Je ne peux pas modifier cette page, c'est celle d'un service tiers.

Que veux tu dire par :"Peux-tu récupérer l'ensemble de la liste des villes répertoriées (la vingtaine d'IDs) ?"
Si je change le code ville je récupère les prévisions d'une autre ville (en fait un spot).

Le lien de mon api est ici, mais il faut un code secret, mais le principe ne change pas : http://magicseaweed.com/developer/forecast-api
Bonjour,
l'Api semble ne permettre qu'un appel par spot.
pour l'instant, tu appelles: http://magicseaweed.com/api/YOURAPIKEY/forecast/?spot_id=10

Peut-être qu'en étant membre, tu as accès à plus de documentation et qu'il est possible de faire un appel du style : http://magicseaweed.com/api/YOURAPIKEY/forecast/?spot_id=10-11-12-13...

Sinon, il faudra que tu fasses un appel pour chaque spot dans une boucle et que tu agrèges le tout.
Modifié par loicbcn (24 Aug 2015 - 10:51)
Bonjour,
J'ai testé ?spot_id=10-11 etc... mais sans succès. Il me donne les données que du premier "spot".

Je n'ai pas accès à plus de doc en étant membre. Si l'API ne permet qu'un appel par spot, y a t'il un moyen d'utiliser une base de données et de faire une requête PHP afin de prendre tous les spots ?
voila
Modifié par woubi (24 Aug 2015 - 18:38)
Il faudrait que tu es une liste des ID's de tous les spots qui t’intéressent, que tu les enregistres dans un tableau puis tu fais une boucle sur l'ensemble des ID's.
Pour récupérer les ID's, tu les notes via leur URL (exemple : http://fr.magicseaweed.com/Cap-Frehel-Surf-Report/1579/)
Tu construis une fois pour toute ton tableau :
$spots = array(
  0 => [
    'name' => 'Cap fréhel',
    'id'   => 1579
  ],
  1 => [
    'name' => 'La Courance',
    'id'   => 4411
  ]
);


Ensuite tu itères tes spots en reconstruisant un tableau contenant les id's des villes qui ont de la pluie :
$spots_with_rain = array(); //la liste des id's des villes avec de la pluie
foreach ($spots as $spot) {
  $response = 'http://magicseaweed.com/api/YOURAPIKEY/forecast/?spot_id=' . $spot['id'];
  if( $response['rain'] ){
    $spots_with_rain[] = $spot['id'];
  }
}


Je ne vois cependant pas dans la réponse JSON de donnée sur la pluie... Peux-tu coller ici un exemple de réponse JSON que tu reçois ?
Modifié par MatthieuR (24 Aug 2015 - 14:12)
Merci beaucoup..... ca m'a bien aidé

En effet, je récupère pas la pluie mais une valeur qui s'appelle "solidRating"
J'ai fait donc un test avec deux spots et je récupère bien la valeur "solidRating" (hauteur des vagues) pour les deux spots.

Seulement voila, je voudrais maintenant trier les spots en fonction du nombre total de "solidRating" envoyé par le fichier json. Dans mon exemple Levento en a 7 et Buggerru en en a 3.

Je voudrais donc que le spot qui a le plus de "solidRationg" s'affiche en premier dans ma page et non pas dans l'ordre que j'ai fait moi-même en haut de la page (par exemple Buggerru s'affiche en 1er alors qu'il n'a que 3 "solidRating" pour les 5 prochain jour).

Une idée ?

Voici mon code (qui peut etre amélioré peut etre...)

<?php
$spots = array(
  0 => [
    'name' => 'Buggerru',
    'id' => 3631
  ],
  1 => [
    'name' => 'Levanto',
    'id'   => 3571
  ]
);

foreach ($spots as $spot) {

?>
<?php
 error_reporting(0);

      $json = file_get_contents("http://magicseaweed.com/api/MYAPIKEY/forecast/?spot_id=" . $spot['id'] . "&units=eu&fields=localTimestamp,solidRating");

    $data = json_decode($json, true);

foreach ($data as $record) 
{
  if( $record['solidRating'] != 0 ){
    ?>
  spot: <?php echo $spot['name']; ?>
  waves: <?php echo $record['solidRating']; ?>

    <?php
    }
  }
}
Ok, c'est bien, ça avance...

Je ne comprends pas pourquoi tu fais une boucle avec $data ? Tu as plusieurs résultats ? Je pensais qu'il n'y avait le retour que d'un seul spot. Peux-tu faire un var_dump($data) pour voir la tête de la réponse ?

Sinon, ne met pas le error_reporting(0); dans la boucle, met-le plutôt au début de ton fichier.

Enfin pour trier tes spots en fonction du 'solidRating', il faut que tu passes par un tableau intermédiaire (comme je te l'indiquais dans mon précédent post) et ensuite tu tries ton tableau (http://php.net/manual/fr/function.ksort.php) :
<?php
$sorted_spots = array(); //la liste des spots pour le futur tri
foreach ($spots as $spot) {
  $json = file_get_contents("http://magicseaweed.com/api/MYAPIKEY/forecast/?spot_id=" . $spot['id'] . "&units=eu&fields=localTimestamp,solidRating");
  $data = json_decode($json, true);

  if( $data[0]['solidRating'] > 0){
    $sorted_spot[$data[0]['solidRating']] = $spot['name'];
  }
}
ksort($sorted_spots); //tri des spots par leur clé (solidRating)
foreach ($sorted_spots as $solidRating => $name) : ?>
  <p>Spot : <?php echo $name; ?><br>
  Waves : <?php echo $solidRating; ?></p>
<?php endforeach; ?>

Modifié par MatthieuR (24 Aug 2015 - 20:23)
Merci,
Pour une raison que je ne maîtrise pas je suis obligé de faire deux boucles pour afficher un résultat.

<?php var_dump($record); ?> donne le résultat suivant :
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) }
array(1) { ["solidRating"]=> int(1) } 


C'est à dire 11 fois un 'solidRating' > 0 (8 fois pour Levanto et 3 fois pour Buggerru pour les cinq prochains jours)

<?php var_dump($spot); ?> donne :
array(2) { ["name"]=> string(8) "Buggerru" ["id"]=> int(3631) }
array(2) { ["name"]=> string(8) "Buggerru" ["id"]=> int(3631) }
array(2) { ["name"]=> string(8) "Buggerru" ["id"]=> int(3631) }
array(2) { ["name"]=> string(7) "Levanto" ["id"]=> int(3571) }
array(2) { ["name"]=> string(7) "Levanto" ["id"]=> int(3571) }
array(2) { ["name"]=> string(7) "Levanto" ["id"]=> int(3571) }
array(2) { ["name"]=> string(7) "Levanto" ["id"]=> int(3571) }
array(2) { ["name"]=> string(7) "Levanto" ["id"]=> int(3571) }
array(2) { ["name"]=> string(7) "Levanto" ["id"]=> int(3571) }
array(2) { ["name"]=> string(7) "Levanto" ["id"]=> int(3571) }
array(2) { ["name"]=> string(7) "Levanto" ["id"]=> int(3571) } 


Le code n'a pas changé :

<?php
$spots = array(
  0 => [
    'name' => 'Buggerru',
    'id' => 3631
  ],
  1 => [
    'name' => 'Levanto',
    'id'   => 3571
  ]
);
$sorted_spots = array();
foreach ($spots as $spot) {

?>
<?php
// error_reporting(0);

 $json = file_get_contents("http://magicseaweed.com/api/MYAPIKEY/?spot_id=" . $spot['id'] . "&fields=solidRating");

    $data = json_decode($json, true);

    foreach ($data as $record) 
    {
      if( $record['solidRating'] != 0 ){
        ?>
     <?php   var_dump($record); ?><br />
     <?php   var_dump($spot); ?>
        <?php
        }
      }
    }


Si je fais un var_dump($data); j'ai toute les données du 'solidRating' (et je ne veux pas celles qui ne sont pas > 0)

Par contre j'ai fais pas mal d'essai mais je ne parviens toujours pas à trier ma liste en fonction du spot où il y a le plus souvent un solidRating > 0 (en l’occurrence Levento pour cet exemple).

Je me plonge dans la doc encore demain, d'ici la si vous avez une petite idée...
Modifié par woubi (25 Aug 2015 - 00:03)
Ok, mais ça n'est pas ce que je t'ai demandé...
La seule donnée pour le moment que j'aimerais que tu donnes est le contenu de $data juste après ton json_decode afin de savoir comment la réponse arrive et quelle forme elle a.

Par ailleurs, le tri se fait avec la fonction ksort() (ou krsort() si tu veux un tri décroissant), si tu suis le dernier code que je t'ai proposé, sa mise en application est simple.
Au lieu d'afficher tes var_dump() dans ta 2è boucle, tu complètes le tableau $sorted_spots si ta condition est remplie et ensuite tu tries le tableau par les valeurs de clés (qui sont les valeurs de 'solidRating').
Modifié par MatthieuR (25 Aug 2015 - 08:45)
var_dump($data) ne donne que ele 'solidRatig' sous cette forme :
array(40) { [0]=> array(1) { ["solidRating"]=> int(1) } [1]=> array(1) { ["solidRating"]=> int(0) } [2]=> array(1) { ["solidRating"]=> int(0) } [3]=> array(1) { ["solidRating"]=> int(0) } [4]=> array(1) { ["solidRating"]=> int(0) } [5]=> array(1) { ["solidRating"]=> int(0) } [6]=> array(1) { ["solidRating"]=> int(0) } [7]=> array(1) { ["solidRating"]=> int(0) } [8]=> array(1) { ["solidRating"]=> int(0) } [9]=> array(1) { ["solidRating"]=> int(0) } [10]=> array(1) { ["solidRating"]=> int(0) } [11]=> array(1) { ["solidRating"]=> int(0) } [12]=> array(1) { ["solidRating"]=> int(0) } [13]=> array(1) { ["solidRating"]=> int(0) } [14]=> array(1) { ["solidRating"]=> int(0) } [15]=> array(1) { ["solidRating"]=> int(0) } [16]=> array(1) { ["solidRating"]=> int(0) } [17]=> array(1) { ["solidRating"]=> int(0) } [18]=> array(1) { ["solidRating"]=> int(0) } [19]=> array(1) { ["solidRating"]=> int(0) } [20]=> array(1) { ["solidRating"]=> int(0) } [21]=> array(1) { ["solidRating"]=> int(0) } [22]=> array(1) { ["solidRating"]=> int(0) } [23]=> array(1) { ["solidRating"]=> int(0) } [24]=> array(1) { ["solidRating"]=> int(0) } [25]=> array(1) { ["solidRating"]=> int(0) } [26]=> array(1) { ["solidRating"]=> int(0) } [27]=> array(1) { ["solidRating"]=> int(0) } [28]=> array(1) { ["solidRating"]=> int(0) } [29]=> array(1) { ["solidRating"]=> int(0) } [30]=> array(1) { ["solidRating"]=> int(0) } [31]=> array(1) { ["solidRating"]=> int(0) } [32]=> array(1) { ["solidRating"]=> int(0) } [33]=> array(1) { ["solidRating"]=> int(0) } [34]=> array(1) { ["solidRating"]=> int(0) } [35]=> array(1) { ["solidRating"]=> int(0) } [36]=> array(1) { ["solidRating"]=> int(0) } [37]=> array(1) { ["solidRating"]=> int(0) } [38]=> array(1) { ["solidRating"]=> int(0) } [39]=> array(1) { ["solidRating"]=> int(0) } } array(40) { [0]=> array(1) { ["solidRating"]=> int(0) } [1]=> array(1) { ["solidRating"]=> int(0) } [2]=> array(1) { ["solidRating"]=> int(0) } [3]=> array(1) { ["solidRating"]=> int(0) } [4]=> array(1) { ["solidRating"]=> int(0) } [5]=> array(1) { ["solidRating"]=> int(1) } [6]=> array(1) { ["solidRating"]=> int(1) } [7]=> array(1) { ["solidRating"]=> int(1) } [8]=> array(1) { ["solidRating"]=> int(1) } [9]=> array(1) { ["solidRating"]=> int(1) } [10]=> array(1) { ["solidRating"]=> int(1) } [11]=> array(1) { ["solidRating"]=> int(0) } [12]=> array(1) { ["solidRating"]=> int(0) } [13]=> array(1) { ["solidRating"]=> int(0) } [14]=> array(1) { ["solidRating"]=> int(0) } [15]=> array(1) { ["solidRating"]=> int(0) } [16]=> array(1) { ["solidRating"]=> int(0) } [17]=> array(1) { ["solidRating"]=> int(0) } [18]=> array(1) { ["solidRating"]=> int(0) } [19]=> array(1) { ["solidRating"]=> int(0) } [20]=> array(1) { ["solidRating"]=> int(0) } [21]=> array(1) { ["solidRating"]=> int(0) } [22]=> array(1) { ["solidRating"]=> int(0) } [23]=> array(1) { ["solidRating"]=> int(0) } [24]=> array(1) { ["solidRating"]=> int(0) } [25]=> array(1) { ["solidRating"]=> int(0) } [26]=> array(1) { ["solidRating"]=> int(0) } [27]=> array(1) { ["solidRating"]=> int(0) } [28]=> array(1) { ["solidRating"]=> int(0) } [29]=> array(1) { ["solidRating"]=> int(0) } [30]=> array(1) { ["solidRating"]=> int(0) } [31]=> array(1) { ["solidRating"]=> int(0) } [32]=> array(1) { ["solidRating"]=> int(0) } [33]=> array(1) { ["solidRating"]=> int(0) } [34]=> array(1) { ["solidRating"]=> int(0) } [35]=> array(1) { ["solidRating"]=> int(0) } [36]=> array(1) { ["solidRating"]=> int(0) } [37]=> array(1) { ["solidRating"]=> int(0) } [38]=> array(1) { ["solidRating"]=> int(0) } [39]=> array(1) { ["solidRating"]=> int(0) } } 
Ok, si tu veux donc afficher toutes des données par spots, il faut donc procéder en 2 temps :
1. créer le tableau des id's des spots trié par valeur cumulées des 'solidRating'
2. utiliser ce tableau trié pour générer une boucle qui appellera l'API pour chaque spot

Ça peut donc donner ça :
constants.php :
<?php
$spots = array(
  0 => [
    'name' => 'chassiron',
    'id'   => 1579
  ],
  1 => [
    'name' => 'biarritz',
    'id'   => 4411
  ]
);

index.php
<?php
include('constants.php');

$sorted_spots = array(); //la liste spots pour le futur tri
foreach ($spots as $spot) {
  $json = file_get_contents("json/" . $spot['name'] . ".json"); //à remplacer par ton appel à l'API avec seulement le 'field' 'solidRating'
  $data = json_decode($json, true);

  $spot_solid_rating_total = 0;
  foreach ($data as $forecast) {
    $spot_solid_rating_total += $forecast['solidRating']; //on additionne tous les solidRating
  }

  $sorted_spots[$spot['id']] = array('solidRating_total' => $spot_solid_rating_total, 'spot_name' => $spot['name']); //on fait correspondre id du spot et nombre de solidRating dans les 5 prochains jours
}

//tri décroissant des spots par leur valeur solidRating en utilisant une fonction anonyme (PHP >= 5.3)
usort($sorted_spots, function($a, $b) {
    return $b['solidRating_total'] - $a['solidRating_total'];
});
var_dump($sorted_spots);


//maintenant tu peux faire tes appels à l'API dans l'ordre voulu
foreach ($sorted_spots as $spot_id => $spot_infos) : 

  var_dump($spot_infos['spot_name']);
  $json = file_get_contents("json/" . $spot_infos['spot_name'] . ".json"); //à remplacer par ton appel à l'API avec toutes tes infos
  //$json = file_get_contents("http://magicseaweed.com/api/MYAPIKEY/forecast/?spot_id=" . $spot_id . "&units=eu");
  $data = json_decode($json, true);

  foreach ($data as $forecast) : 

    //tu utilises tes données comme tu veux ?>
    <p>Spot : <?php echo $spot_infos['spot_name']; ?><br>
    Timestamp : <?php echo $forecast['timestamp']; ?><br>
    Waves : <?php echo $forecast['solidRating']; ?></p>

  <?php endforeach; ?>

<?php endforeach; ?>
Merci,
En mettant ma condition != 1 pour le solidRating alors ca ne trie pas.
Le spot Biarritz devrait apparaître en premier!
Voici le code :
<?php
$spots = array(
  0 => [
  'name' => 'Chassiron',
  'id'   => 68
  ],
  1 => [
  'name' => 'Biarritz',
  'id' => 62
  ]
);

$sorted_spots = array();
foreach ($spots as $spot) 
  {
?>

  <table>
    <caption><?php echo $spot['name']; ?></caption>
    <thead>
      <tr>
        <th>Semaine <?php echo date("W") ?></th> 
        <th>solidRating</th>
      </tr>
    </thead>
<?php
 error_reporting(0);
    // You should fetch the JSON data from the remote location the same
      $json = file_get_contents("http://magicseaweed.com/api/MYAPIKEY/forecast/?spot_id=" . $spot['id'] . "&units=eu&fields=localTimestamp,solidRating");

 // $json=file_get_contents("json/couronne.json");

    // Decode the JSON data into a PHP array using 'true'
    // as 2nd argument of the json_decode funtion
    $data = json_decode($json, true);
    
    // Iterate each of the records and access the data as needed
  // $counter = 0;
    $spot_solid_rating_total = 0;
    foreach ($data as $record) 
    {
      $spot_solid_rating_total += $record['solidRating']; 
      //on additionne tous les solidRating

if ( $record['solidRating'] != 0 ) 
      { ?>
      <tr>
        <td> <?php echo date("<b>D</b> d/m", $record['localTimestamp']) ?><br />
          <?php echo date("H", $record['localTimestamp']) ?>h00
        </td>
        <td>
          <?php echo $record['solidRating']; ?>
        </td>

<?php

$record['solidRating'] == 0;
$record['solidRating'] == 1;
$record['solidRating'] == 2;
$record['solidRating'] == 3;
$record['solidRating'] == 4;
$record['solidRating'] == 5;


?>


<?php
    }
  }
  $sorted_spots[$spot['id']] = array('solidRating_total' => $spot_solid_rating_total, 'spot_name' => $spot['name']); //on fait correspondre id du spot et nombre de solidRating dans les 5 prochains jours
}
usort($sorted_spots, function($a, $b) {
    return $b['solidRating_total'] - $a['solidRating_total'];
});
?>

      </tr>
    </table>



Bon, j'ai un peu de mal avec le tri...
Non, tu n'as pas compris...
Tu n'affiches rien dans un premier temps, rien dans la première boucle, elle ne sert qu'à générer un tableau des id's que l'on va trier !
C'est dans une deuxième boucle que tu vas récupérer tes données, dans cette boucle -là :
//maintenant tu peux faire tes appels à l'API dans l'ordre voulu
foreach ($sorted_spots as $spot_id => $spot_infos) : ?>

<table>
  <caption><?php echo $spot_infos['spot_name']; ?></caption>
  <thead>
    <tr>
      <th>Semaine <?php echo date("W") ?></th> 
      <th>solidRating</th>
    </tr>
  </thead>
  <tbody>

<?php

  $json = file_get_contents("http://magicseaweed.com/api/MYAPIKEY/forecast/?spot_id=" . $spot_id . "&units=eu");
  $data = json_decode($json, true);

  foreach ($data as $forecast) :

    //ajoute ici ta condition si vraiment tu veux
    if($forecast['solidRating'] > 0) :

    //tu utilises tes données comme tu veux ?>
    <tr>
      <td> <?php echo date("<b>D</b> d/m", $forecast['localTimestamp']) ?><br />
        <?php echo date("H", $forecast['localTimestamp']) ?>h00
      </td>
      <td>
        <?php echo $forecast['solidRating']; ?>
      </td>
    </tr>
    <?php endif; ?>
  <?php endforeach; //fin de $data?>
  </tbody>
</table>

<?php endforeach; //fin de $sorted_spots?>


Je ne pourrais pas t'en dire plus, ce code fonctionne...encore faut-il que tu l'adaptes correctement (enfin tu n'as qu'as le recopier...)
Merci, oui j'ai fait n'importe quoi!!! désolé....
Par contre j'ai été induis en erreur avec l'include où j'avais copié bêtement ton code sans mettre <?php
au début du fichier.
Mais bon, ok, j'ai compris le principe et merci beaucoup.