Page 1 sur 1

Trier des données résultant d'une API Json

Posté : 15 mai 2021, 04:39
par michel47
Bonsoir,
J'utilise une API au format json.
Je passe donc par un json_decode afin de pouvoir faire une boucle foreach.
Cette boucle foreach créé un tableau a 4 colonnes
Mon code est fait comme ceci

Code : Tout sélectionner

<?php $api = file_get_contents("ici le lien vers les données de l'API"); $parsedAPI = json_decode($api,true); foreach ($parsedAPI['tableau'] as $datas) { $mavariable1=$datas ['data1']; $mavariable2=$datas['data2']; $mavariable3=$datas['data3']; $mavariable4=$datas['data4']; et ici le code pour afficher mes variables } ?>
Mon problème c'est que je souhaite faire un tri avec la fonction sort() la première colonne du tableau (donc sur la variable $mavariable1) et cette fonction n'est disponible que pour un array visiblement.
Comment faire pour pouvoir faire ce tri ?
Est t-il possible de transformer un json_decode en array ?
Faut t-il faire le tri dans la boucle foreach ?
je suis un peu perdu
Merci

Re: Trier des données résultant d'une API Json

Posté : 15 mai 2021, 11:36
par @rthur
Je ne suis pas sûr de comprendre comment ton tableau est constitué, mais regarde peut-être du côté de la fonction array_multisort()

Re: Trier des données résultant d'une API Json

Posté : 26 mai 2021, 16:38
par michel47
Merci pour ta réponse.
En fait mon tableau est un classement sportif
la 1ere colonne c est le rang
la 2e colonne l'équipe
la 3e colonne le nombre de points
la 4eme le nombre de matchs
En fait le problème vient de l'API (qui n'a pas fait le tri et comme ils ne répondent pas quand je les contacte, je souhaite faire le tri moi-même (et donc faire le tri sur la colonne "rang"

J'ai essayé ceci

Code : Tout sélectionner

$api = file_get_contents("ici le lien vers les données de l'API"); $parsedAPI = json_decode($api, $assoc=true); sort($parsedAPI);
Mais ça ne fonctionne évidemment pas (déjà j'imagine qu'il faut lui indiquer sur quelle colonne faire le tri)

Re: Trier des données résultant d'une API Json

Posté : 26 mai 2021, 17:15
par Ryle
Une fois ton flux récupéré et décodé, il semble que ta variable $parsedAPI['tableau'] soit justement un tableau (sans quoi tu ne pourrais pas faire de foreach pour en parcourir les éléments :)). C'est donc ce tableau qu'il te faut isoler et trier avant de le parcourir avec le foreach.

La difficulté pour le trier vient du fait qu'il s'agit visiblement d'un tableau à plusieurs dimensions et que tu veux le trier en fonction de la valeur de la colonne data1. Comme l'a suggéré @rthur, tu peux pour cela utiliser array_multisort() en récupérant les valeurs de data1 avec array_column() (.
$keys = array_column($parsedAPI['tableau'], 'data1');
array_multisort($keys, SORT_ASC, $parsedAPI['tableau']);
Cela devrait permettre d'indexer ton tableau (et donc permettre de le trier) en fonction des valeurs qu'il contient :)

Re: Trier des données résultant d'une API Json

Posté : 26 mai 2021, 17:39
par michel47
Il m'a mis un gros message d'erreur
Fatal error: Uncaught TypeError: array_multisort(): Argument #3 must be an array or a sort flag in C:\xampp\htdocs\sitesweb\classement.php:16 Stack trace: #0 C:\xampp\htdocs\sitesweb\classement.php(16): array_multisort(Array, 4, NULL) #1 {main} thrown in C:\xampp\htdocs\sitesweb\classement.php on line 16

En fait ce que je ne comprends pas c'est le data1 du $keys = array_column($parsedAPI['tableau'], 'data1');
le data1 n'est récupéré que dans le foreach non ?
Il faut que je garde le $assoc=true que j'avais mis (et qui ne doit pas être bon) ?

En gros le code complet donnerait ça ?

Code : Tout sélectionner

<?php $api = file_get_contents("ici le lien vers les données de l'API"); $parsedAPI = json_decode($api, $assoc=true); $keys = array_column($parsedAPI['tableau'], 'data1'); array_multisort($keys, SORT_ASC, $parsedAPI['tableau']); foreach ($parsedAPI['tableau'] as $datas) { $mavariable1=$datas ['data1']; $mavariable2=$datas['data2']; $mavariable3=$datas['data3']; $mavariable4=$datas['data4']; et ici le code pour afficher mes variables } ?>

Re: Trier des données résultant d'une API Json

Posté : 26 mai 2021, 19:05
par Ryle
C'est étonnant que tu ais ce message d'erreur sur le array_multisort() et pas sur le array_column() alors que c'est le même tableau qui passé en paramètre... Mais c'est peut être parce que c'est un sous-tableau que le multisort() ne fonctionne pas et génère une erreur.

En fait, quand tu décodes ton flux json, le fait de passer le second paramètre à true, a pour effet de le transformer l'objet json reçu en tableau associatif qui est affecté à ta variable $parsedAPI. Tu peux faire un var_dump ou un print_r($parsedAPI) pour le constater.

Tu verras également la structure de ton tableau et les indexes utilisés. D'après le code que tu as donné, tu devrais trouver un index nommé 'tableau', sous lequel il y a une liste de tableaux (sur laquelle tu fais le foreach pour les parcourir un par un), et dans chacun de ces tableaux tu vas retrouver un index 'data1' avec la valeur correspondante, un index 'data2' avec sa valeur, etc.

L'objectif de array_column() ici est de te récupérer la liste des valeurs de chaque "data1" présents dans ton tableau afin de pouvoir les utiliser pour trier tout le tableau :)

Essaies de sortir le tableau dans une variable avant de le trier et dis nous si tu as toujours l'erreur (et si ça répond à ton besoin ;))
$parsedAPI = json_decode($api, true);
$table = $parsedAPI['tableau'];
$keys = array_column($table, 'data1');
array_multisort($keys, SORT_ASC, $table);
foreach ($table as $datas) {
...

Re: Trier des données résultant d'une API Json

Posté : 26 mai 2021, 19:15
par michel47
j'ai essayé le code, je n'ai plus de message d erreur. le tableau est revenu à l'état initial (c'est a dire non-trié)

Re: Trier des données résultant d'une API Json

Posté : 27 mai 2021, 13:14
par Ryle
Peux-tu nous poster un extrait de ce que retourne l'api afin que l'on puisse voir comment est structuré ton tableau ?

Re: Trier des données résultant d'une API Json

Posté : 27 mai 2021, 14:14
par michel47
en faisant le

Code : Tout sélectionner

var_dump($parsedAPI);
ou une capture d'écran graphique ?