J'ai créé un classement de quelques joueurs d'un jeu vidéo, je vais chercher leurs infos sur une API.
J'ai donc a la fin un array $data, dont les valeurs importantes sont $data['name'], $data['townHallLevel'], $data["expLevel"] et $data["tag"].
Pour le moment, je les affiches normalement, en les organisant manuellement (en fonction du niveau) mais j'aimerais pouvoir les classer et il me semble que le mieux, c'est de les classer dans un array.
Ce qui rend la manipulation difficile:
Pour récupérer les informations, je les récuperes dans une boucle while en les affichant directement (ce qui fait que $data change constament).
Je voudrais les classer en fonction du niveau, sachant qu'il y a plusieurs autres variables qui correspondent aux joueurs mais qui ne sont pas le niveau qui doivent etre classer dans le meme ordre ($data["tag"] par exemple).
Voila, je demande votre aide parce que c'est trop tordu pour moi.
Si vous avez besoin que je vous explique quelque chose que vous n'avez pas compris (j'ai du mal a expliquer clairement ce que je veux dire) ou si vous voulez plus de details, n'hésitez pas a me poser des questions !
Sans forcement tout nous mettre, mais juste un exemple représentatif
- montre nous ce que tu recois de l'api
- ce que tu souhaiterai obtenir comme tableau cela nous permetra de savoir si le resultat de nos traitement retourne bien ce que tu attends
- et ton code actuelle parce que ce ne doit pas être compliqué a faire mais je ne ferai pas tout a ta place si tu n'as pas deja commencé a bosser dessus
"Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité" A.E.
si j'ai bien compris, tu as donc un tableau multi-dimensionnel et tu souhaites trier en fonction d'une valeur des sous-tableaux ?
Si c'est bien le cas, tu peux te tourner vers la fonction usort qui est très pratique pour cela.
Voilà =)
J'y connais rien du tout dans les tableaux en fait x) Je m'en suis rendu compte en cherchant un peu plus.
En gros, j'ai quelque chose que ressemble a ca:
while($whileTest <= 20) {
Je récupère ici le tableau $data dans lequel il y a une tone d'information et qui va etre différent a chaques tours de while. Les informations qui m'interessent sont marquées en haut.
echo $data['expLevel']; (Par exemple)
$whileTest++;
}
je veux donc stocker mes informations, j'imagine qu'il faut que je fasse un tableau $level['$whileTest'][Les différentes variables que je veux récupérer].
Le probleme c'est que parmis les différentes variables a récupérer, il y a le niveau, et c'est avec ce niveau que je veux classer les joueurs (je ne peux pas faire $level[niveau][Les différentes autres variables] car 2 joueurs peuvent avoir le meme niveau.
Je sais pas si c'est la bonne facon.
Par contre, j'ai regardé le usort et ca m'a l'air d'etre bon, mon probleme se dirige juste dans le stockage du coup, c'est la ou j'ai vraiment de nombreux problemes.
kets14 a écrit:
Bonjour,
Sans forcement tout nous mettre, mais juste un exemple représentatif
- montre nous ce que tu recois de l'api
- ce que tu souhaiterai obtenir comme tableau cela nous permetra de savoir si le resultat de nos traitement retourne bien ce que tu attends
- et ton code actuelle parce que ce ne doit pas être compliqué a faire mais je ne ferai pas tout a ta place si tu n'as pas deja commencé a bosser dessus
Je recois un array $data contenant une tonne de variables.
J'aimerais avoir un tableau contenant les joueurs triés en fonction de leur niveau
Pour le code j'ai rien du tout qui marche (c'est pour ca que je demande de l'aide, pour savoir plus ou moins comment faire).
Ici, il y a 20 variables qui correspondent a 20 joueurs classés par leur niveau (lorsque le classement change, je dois changer manuelement ici, je vais en chercher 1 par tours du while
$whileTest = 1;
while($whileTest <= 20) {
Ici, il y a le code permettant d'aller chercher le $data dans l'api
$playerTag = $data['tag'];
$playerTag = substr($playerTag, 1); Je m'en sert juste car le tag commence par # et je ne peux pas le faire passer par l'url si il y a un #.
Ici, il y a 20 variables qui correspondent a 20 joueurs classés par leur niveau (lorsque le classement change, je dois changer manuelement ici, je vais en chercher 1 par tours du while
$whileTest = 1;
while($whileTest <= 20) {
Ici, il y a le code permettant d'aller chercher le $data dans l'api
$playerTag = $data['tag'];
$playerTag = substr($playerTag, 1); Je m'en sert juste car le tag commence par # et je ne peux pas le faire passer par l'url si il y a un #.
ET sinon il fait beau chez toi(#ironie, #second degré), si je te demandes des infos ce n'est pas juste pour avoir le plaisir d'user mon clavier! Mais pour mieux t'aider ! si on ne sait meme pas quel api tu utilises ni ce qu'elle t'envoie on navigue a l'aveuglette
et ce n'est pas
Ici, il y a le code permettant d'aller chercher le $data dans l'api
qui va nous faire avancer
"Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité" A.E.
Ici, il y a 20 variables qui correspondent a 20 joueurs classés par leur niveau (lorsque le classement change, je dois changer manuelement ici, je vais en chercher 1 par tours du while
$whileTest = 1;
while($whileTest <= 20) {
Ici, il y a le code permettant d'aller chercher le $data dans l'api
$playerTag = $data['tag'];
$playerTag = substr($playerTag, 1); Je m'en sert juste car le tag commence par # et je ne peux pas le faire passer par l'url si il y a un #.
ET sinon il fait beau chez toi(#ironie, #second degré), si je te demandes des infos ce n'est pas juste pour avoir le plaisir d'user mon clavier! Mais pour mieux t'aider ! si on ne sait meme pas quel api tu utilises ni ce qu'elle t'envoie on navigue a l'aveuglette
et ce n'est pas
Ici, il y a le code permettant d'aller chercher le $data dans l'api
qui va nous faire avancer
Je fais ca pour simplifier étant donné que le fait d'aller chercher les valeurs marche déja et que c'est pas la mon probleme mais si ca te fait plaisir:
C'est pas pour mon plaisir a la limite je m' en balec de ton soucis c'est pas ca qui changera ma vie et malgrés tout j'essaie de t'aider. Mais juste avec ton dernier message j'ai obtenu une info importante que je t'ai demandé a mon premier message c'est a dire la structure de ce que te renvoie l'api
C'est pas pour mon plaisir a la limite je m' en balec de ton soucis c'est pas ca qui changera ma vie et malgrés tout j'essaie de t'aider. Mais juste avec ton dernier message j'ai obtenu une info importante que je t'ai demandé a mon premier message c'est a dire la structure de ce que te renvoie l'api
cela peut paraitre rien pour toi mais cela nous fais une base de travail parce que l'on sait de quoi on part afin d'obtenir le résultat souhaité
Désolé d'avoir été un peu "sec", mais je comprennais pas en quoi ca pouvait nous avancer.
Donc, mon but pour ce site c'est de récupérer les informations du data et de faire un classement des niveaux. Ce que je fesais manuellement (le classement. Les niveaux, eux sont mis a jours automatiquement).
J'ai trouvé cette méthode pour récupérer les informations, je la comprend pas completement et j'imagine que c'est pas du tout propre étant donné que je l'ai bricolé car a la base elle permettait d'aller chercher des informations dans l'aip sur autre chose.
Le classement est donc mon probleme.
J'imagine qu'il va falloir utiliser des tableaux multidimentionnels ce qui est un peu vague pour moi (je me suis documenté dessus mais c'est toujours tres flou)
Merci
- Edité par paul64lafourcade 12 avril 2017 à 18:56:46
Je n'ai pas testé donc je reste dans la théorie mais je ne pense pas trop me tromper en disant que dans memberlist tu devrais recupérer tout les membre du clan en une seul fois et qu'il ni aurait plus aprés qu'à trier sur explevel de chaque membre plutot que d'acceder 22 fois a l'api dans ta boucle (ce qui va ralentir l'écécution de ton script) tu n'a plus qu'une connexion a l'api a avoir
- Edité par kets14 13 avril 2017 à 12:16:09
"Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité" A.E.
Non malheuresement, les joueurs sont dans des clans différents et ils ont meme tendance a changer de clans souvent...
On ne peut donc pas faire comme ca malheuresement meme si comme tu le dis ca serait plus facile.
Le foreach pourrait en effet etre pas mal, mais je me demandais si on pourrait pas modifier le $data pour en faire un array multidimentionnel, ainsi on pourrait avoir data[nom du joueur][différentes variables];
ainsi on aurait directement notre array et on aurait pas a transferer le $data dans un autre array
- Edité par paul64lafourcade 14 avril 2017 à 11:59:31
Désolé, je t'ai un peu zappé mais a ma décharge j'aide une dizaine de membre chaque jour ! que penserai tu de passer par une base de données pour automatisé ton code ?
"Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité" A.E.
Désolé, je t'ai un peu zappé mais a ma décharge j'aide une dizaine de membre chaque jour ! que penserai tu de passer par une base de données pour automatisé ton code ?
Salut, pas de problemes, je comprend tout a fait.
Je n'ai pas suffisament de connaissances en base de données pour le moment. De toute facon, étant donné que je recupère le $data d'une api, je sais pas trop comment on aurait pu faire.
Bon, je veux mettre des array dans un autre array qu'on puisse ensuite classer, je sais que je réussirais jamais a résoudre ce truc entierement mais si quelqu'un pourrait m'aider un poil ca serait génial !
je viens de voir que ton soucis n'était toujours pas réglé, du coup, pour repartir sur de "bonne" base, peux-tu nous mettre le code complet (récupération des données, traitement, affichage, ..) que tu as pour l'instant ?
je viens de voir que ton soucis n'était toujours pas réglé, du coup, pour repartir sur de "bonne" base, peux-tu nous mettre le code complet (récupération des données, traitement, affichage, ..) que tu as pour l'instant ?
Merci =)
C'est tres tres salle comme code mais voila:
<!DOCTYPE html>
<html>
<head>
<link rel="icon" type="image/png" href="hdv2.png" />
<meta charset="utf-8" />
<!--[if lt IE 9]>
<script src="http://github.com/aFarkas/html5shiv/blob/master/dist/html5shiv.js"></script>
<![endif]-->
<link rel="stylesheet" href="lowdonators.css" />
<title>Low Donators - TH 2 but huge level</title>
</head>
<body>
<header>
<!-- <h1 class="title">Low Donators</h1> -->
<a href="index.php"><img src="logo.png" alt="Low Donators Website" class="title" /></a>
</header>
<!--TH2 -->
<div class='carre'>
<img src="hdv2.png" id="hdv" />
<h3>LEADERBOARD OF THE BEST TH2 LEVELS :</h3>
<p id="attention">The levels are updated automaticly but not the order so message me at @arcree_coc on Instagram if something is false !</p>
<!-- <p>n1 doesn't want to be shown here</p> -->
<?php
$player[1] = "#9QC8LC9VV"; //iOS Bot - T2
$player[2] = "#9CP9YCJ8U"; //rh2 donator
$player[3] = '#9UCL00YQL'; //qqqqqqqqqqqqqqq
$player[4] = "#9CGGCRGQY"; //Mystic th 2
$player[5] = "#9RCCPGUPC"; //WOKBYY-TH2
$player[6] = '#9VGQYGQ9R'; //Town Moonk
$player[7] = '#99CY9RCU0'; //ninja Th2
$player[8] = '#9RP20LJ0P'; //ArcreeLvlUp Th2
$player[9] = '#9V9099GG8'; //THE_NORTH_FACE
$player[10] = '#P8CCPR2PY'; //Isaiah
$player[11] = "#99CRUCPRQ"; //Lori's TH2
$player[12] = '#9RJQPJQQG'; //TH2 General 2
$player[13] = '#9VVGYJLQ9'; //TH2 GOD
$player[14] = '#9JU9P9R8R'; //zoel em
$player[15] = "#9YG2G89VJ"; //Kiddo Has Th2?
$previous = 700;
$whileTest = 1;
while($whileTest <= 15) {
$token = "apparement il faut pas la donner";
$playertag = $player[$whileTest];
$url = "https://api.clashofclans.com/v1/players/" . urlencode($playertag);
$ch = curl_init($url);
$headr = array();
$headr[] = "Accept: application/json";
$headr[] = "Authorization: Bearer ".$token;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headr);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
$data = json_decode($res, true);
curl_close($ch);
$playerTag = $data['tag'];
$playerTag = substr($playerTag, 1);
if($data['townHallLevel'] > 3 || $data["expLevel"] > $previous) {
?><a href='player.php?tag=<?php echo $playerTag; ?>' target="_blank" id="players" ><p style="color:red;"><?php echo $whileTest ?> - [TH<?php echo $data["townHallLevel"]; ?>] <?php echo $data["name"]; ?> (<?php echo $data["tag"]; ?>) : <?php echo $data["expLevel"]; ?></p></a><?php
}
else {
?><a href='player.php?tag=<?php echo $playerTag; ?>' target="_blank" id="players" ><p><?php echo $whileTest ?> - [TH<?php echo $data["townHallLevel"]; ?>] <?php echo $data["name"]; ?> (<?php echo $data["tag"]; ?>) : <?php echo $data["expLevel"]; ?></p></a><?php
}
$previous = $data["expLevel"];
$whileTest++;
}
?>
<p>If you know a TH2 Level 35+ who is not on this list, send me a message at @arcree_coc or @lowdonators on instagram</p>
</div>
</body>
</html>
Comme tu le vois (si tu comprends ce bordel), ca fait un classement que je met a jour en changant les id de joueurs d'ordre.
Comme tu peux le voir, j'ai simplement "organisé" en plusieurs parties : Définition des identifiants, récupération des données, tri des données, affichage.
Maintenant, j'ai supprimé la partie concernant le tri pour te laisser y réfléchir. Le code est très simple, et comme je te l'ai dis dans mon premier message, si tu veux faire un tri d'un tableau multi-dimensionnel, une fonction très pratique pour cela, c'est usort().
Salut, je veux trier avec expLevel et pas townHallLevel
Un énorme merci pour tout ce que tu as fait !
Le tris avec le townHallLevel me permettait juste de savoir si le niveau du townhall avait changé plus facilement, c'était rien de très important !
J'enleve aussi le premier caractère de $data['tag'] pour pouvoir envoyer le tag par url sachant que le premier caractère est toujours #
Je vais maintenant essayer de comprendre tout ca et faire le classement
Apres un peu de recherches, je t'avoues que j'ai un peu de mal a comprendre comment je peux classer a partir de $playersData['expLevel'] d'autant plus que je comprends pas réellement le fait que pour chaque boucle du foreach, un $playersData est créé, il est sensé y avoir plusieurs tableaux avec le meme nom ? C'est un peu compliqué pour moi tous ces tableaux
- Edité par paul64lafourcade 20 mai 2017 à 14:50:54
en effet, pardon, j'ai pas mis trop d'explication, je pensais que tu comprendrais, mais je vais essayer de t'expliquer ce que j'ai changé, pour que tu comprennes la "logique" du truc.
<?php
/**
* Identifiants des joueurs
*/
// On stock les id des joueurs dans un tableau (le # a été enlevé car il y est toujours)
$playersId = [
"9QC8LC9VV", // iOS Bot - T2
"9CP9YCJ8U", // rh2 donator
"9UCL00YQL", // qqqqqqqqqqqqqqq
"9CGGCRGQY", // Mystic th 2
"9RCCPGUPC", // WOKBYY-TH2
"9VGQYGQ9R", // Town Moonk
"99CY9RCU0", // ninja Th2
"9RP20LJ0P", // ArcreeLvlUp Th2
"9V9099GG8", // THE_NORTH_FACE
"P8CCPR2PY", // Isaiah
"99CRUCPRQ", // Lori's TH2
"9RJQPJQQG", // TH2 General 2
"9VVGYJLQ9", // TH2 GOD
"9JU9P9R8R", // zoel em
"9YG2G89VJ", // Kiddo Has Th2?
];
/**
* Récupération des données
*/
// On sort les infos "constantes", pas besoin de les redéfinir à chaque itération de la boucle
$token = "TON TOKEN";
$baseUrl = "https://api.clashofclans.com/v1/players/";
// Création d'un tableau qui contiendra toutes les données "nécessaire" des joueurs
$playersData = [];
// Boucle pour récupérer les données des joueurs un par un
foreach( $playersId as $playerId ){
// Initialisation de cUrl à partir de l'url "statique" + id du joueur auquel on a ajouté le #
$ch = curl_init($baseUrl.urlencode("#".$playerId));
// On définit les options pour cUrl
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Accept: application/json", "Authorization: Bearer ".$token]);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Execution de cUrl
$response = curl_exec($ch);
// Si on a reçu les données voulu
if( curl_getinfo($ch, CURLINFO_HTTP_CODE) == "200" ){
// On décode les données
$data = json_decode($response, true);
// On stock les données désiré dans un sous-tableau de $playersData
$playersData[] = [
"tag" => substr($data["tag"], 1),
"townHallLevel" => $data['townHallLevel'],
"expLevel" => $data["expLevel"],
"name" => $data["name"],
];
}
// On ferme cUrl
curl_close($ch);
}
// $playersData contient maintenant un sous tableau pour chaque joueur
// $playersData = [
// ["tag" => "a", "townHallLevel" => "aa", "expLevel" => "aaa", "name" => "aaaa"],
// ["tag" => "b", "townHallLevel" => "bb", "expLevel" => "bbb", "name" => "bbbb"],
// ["tag" => "c", "townHallLevel" => "cc", "expLevel" => "ccc", "name" => "cccc"],
// ...
// ];
/**
* Tri des données des joueurs
*/
// A FAIRE
/**
* Affichage des données
*/
// Initialisation du "rang" à afficher
$i = 1;
// Boucle pour afficher les données joueur par joueur
foreach( $playersData as $player ){
// Choix de la couleur du texte
$color = "";
if($player['townHallLevel'] > 3){
$color = "style='color:red;'";
}
?>
<!-- Affichage des données -->
<a href='player.php?tag=<?= $player['tag'] ?>' target="_blank" id="players" >
<p <?= $color ?>>
<?= $i ?> - [TH<?= $player["townHallLevel"] ?>] <?= $player["name"] ?> (<?= $player["tag"] ?>) : <?= $player["expLevel"] ?>
</p>
</a>
<?php
// Incrémentation du rang
$i++;
}
?>
Concernant le tri, tu peux le faire sur ce que tu veux, le code ne change pas, tu as juste a bien faire ta fonction de tri.
Après, comme tu as pu le voir, j'ai enlevé tout ce qui concerne ta variable $previous, je n'ai pas compris à quoi elle servait (hormis la couleur, mais tu la défini à 700 au début, ce qui m'a semblé un peu "random"), mais tu peux la remettre bien sûr.
Ma variable previous me permettait de savoir si le classement était bon juste en visitant la page vite fait: Je pouvais tester si le joueur en dessous n'avait pas un plus gros niveau que le joueur en dessus.
Le 700 c'était juste un truc que j'avais mis en fesant des tests et que j'avais oublié d'enlever
J'aimerais te remercier au plus haut point ! J'ai finalement un résultat qui marche et en plus le code entier est 100 fois plus propre !
@paul64lafourcade : Super ! Juste une petite "précision", si je puis me permettre, tu peux faire encore plus court pour ta fonction usort() en utilisant une fonction anonyme (à condition que n'utilise pas ta fonction ailleurs dans ton code), par exemple :
<?php
usort($playersData, function($a, $b){
// TODO
});
?>
Voilà, c'est tout, rien de bien méchant
@Romuald44 : Utiliser une bdd permettrai de rendre le tri plus facile, mais ça oblige à devoir mettre la base de donnée à jour régulièrement, donc le code complet final devient plus "complexe". Cela serai un "bon" choix si il y avait beaucoup de joueurs à classer, mais pour 15-20, c'est pas vraiment nécessaire.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales