Page 1 sur 2

Faire un classement par point !

Posté : 10 oct. 2005, 17:43
par blustic
Bonjour,

J'ai un site de pronostics et j'aimerais établir un classement des membres
J'ai ce code mais je ne vois pas comment gérér le array automatiquement car dans ce script il faut insérer manuellement les valeur dans le fichier
<?
$mon_tableau = array("a"=>"bleu","b"=>"rouge","c"=>"vert","d"=>"orange");
asort($mon_tableau);
reset($mon_tableau);
while(list($key,$val) = each($mon_tableau)){
    print "$key -> $val<BR>\n";
}
 ?>
Est-ce possible à partir de données d'un fichier texte ou se trouverons :

Code : Tout sélectionner

Prénom|point Prénom|point Prénom|point
Permettre au code de classer automatiquement par nombre de point les données dans un tableau.

Merci d'avance

Ps: si vous avez une autre solution sinon cela peut m'intérésser

Posté : 10 oct. 2005, 17:54
par pjl
Une base de données ?

Posté : 10 oct. 2005, 17:55
par heddicmi
Sinon, si tu veux pas de bdd, passe par les fonctions de tri de tableau... Comme asort()

Posté : 10 oct. 2005, 17:56
par zeus
Tiens, un exemple de code bidouillé vite fait

J'ai fait un affichage et pas une insertion dans un fichier mais si tu as compris l'idée, tu y arriveras tout seul
$url = "url du fichier";

//On récupère le contenu du fichier dans un tableau
$a_file = file($url);

//On parcours le contenu du fichier en mettant le nom dans le tableau et les points comme index
$a_classement = array();
foreach ($a_file as $ligne) {
    //On découpe la ligne récupérée selon le |
    $a_ligne = explode("|", $ligne)
    
    //le nom est le 1er element, les point le 2nd
    $point = $a_ligne[1];
    $nom = $a_ligne[0];
    
    //On enregistre dans le tableau
    $a_classement[$point] = $nom;
}

//On tri le tableau selon les index (les points)
ksort($a_classement);

//Ici un joli affichage mais tu peut faire l'écriture dans un fichier
echo "<ol>";
foreach ($a_classment as $point => $nom) {
    echo "<li>".$nom." - ".$points." point(s)</li>";
}
echo "</ol>

Posté : 10 oct. 2005, 18:15
par blustic
Merci,

Mais les données je sais les rentrer dans un fichier texte ça c'est fait c'est juste pour les insérer dans un tableau et les trier par ordre décroissant

La base de données pourquoi pas mais je sais pas comment faire !

Sinon zeus je ne comprend pas trop ton code tu peux m'expliquer un peu je l'ai testé pour essayer de compendre mais il fait une erreur ligne 14.

Merci

Posté : 10 oct. 2005, 18:22
par heddicmi
Y a un truc que je saisis dans ta logique Zeus... Tu mets comme index les points... Mais en cas d'égalité, tu remplaces le nom précédent par le nouveau... ça ne me parait pas très judicieux...

Posté : 10 oct. 2005, 19:05
par zeus
Sinon zeus je ne comprend pas trop ton code tu peux m'expliquer un peu je l'ai testé pour essayer de compendre mais il fait une erreur ligne 14.Merci
L'erreur, c'est que j'ai oublié un ; à la fin de cette ligne
$a_ligne = explode("|", $ligne);
Sinon, dit moi ce que tu ne comprend pas
Mais en cas d'égalité, tu remplaces le nom précédent par le nouveau
Bien joué

Dans ce cas, il faut mettre les noms en index et faire le tri sur les valeurs et non plus sur les clés. Mais en cas d'égalité, le 1er du fichier sera le 1er

Code corrigé et remarque de heddicmi intégrée
$url = "url du fichier";

//On récupère le contenu du fichier dans un tableau
$a_file = file($url);

//On parcours le contenu du fichier en mettant le nom dans le tableau et les points comme index
$a_classement = array();
foreach ($a_file as $ligne) {
    //On découpe la ligne récupérée selon le |
    $a_ligne = explode("|", $ligne);
    
    //le nom est le 1er element, les point le 2nd
    $point = $a_ligne[1];
    $nom = $a_ligne[0];
    
    //On enregistre dans le tableau
    $a_classement[$nom] = $point;
}

//On tri le tableau selon les valeurs(les points)
sort($a_classement);

//Ici un joli affichage mais tu peut faire l'écriture dans un fichier
echo "<ol>";
foreach ($a_classment as $nom=> $point) {
    echo "<li>".$nom." - ".$points." point(s)</li>";
}
echo "</ol>

Posté : 10 oct. 2005, 19:24
par blustic
Merci,

J'étais contenté sur la ligne 14 je n'avais meme pas vu que c'était juste au dessus.

Ton code :
<?
$url = "fichier.txt"; 

//On récupère le contenu du fichier dans un tableau 
$a_file = file($url); 

//On parcours le contenu du fichier en mettant le nom dans le tableau et les points comme index 
$a_classement = array(); 
foreach ($a_file as $ligne) { 
    //On découpe la ligne récupérée selon le | 
    $a_ligne = explode("|", $ligne);
     
    //le nom est le 1er element, les point le 2nd 
    $point = $a_ligne[1]; 
    $nom = $a_ligne[0]; 
     
    //On enregistre dans le tableau 
    $a_classement[$point] = $nom; 
} 

//On tri le tableau selon les index (les points) 
ksort($a_classement); 

//Ici un joli affichage mais tu peut faire l'écriture dans un fichier 
echo "<ol>"; 
foreach ($a_classment as $point => $nom) { 
    echo "<li>".$nom." - ".$points." point(s)</li>"; 
} 
echo "</ol> 

?>
Indique :
Parse error: parse error, unexpected $ in /.../.../.../ma_page.php on line 31
Je ne vois pas pourquoi ligne 31 c'est la fin du script ?>

Posté : 10 oct. 2005, 19:27
par blustic
Quand vous dites index

Qu'est-ce que c'est ??

Merci

Posté : 10 oct. 2005, 21:04
par blustic
Non c'est bon j'ai trouvé l'erreur il manquait un ; à la dernière ligne

Par contre il me met maintenant :

Invalid argument supplied for foreach() ligne 26

Tu sais d'ou sa vient ?

Merci

Posté : 10 oct. 2005, 21:06
par Cyrano
À priori, la variable testée n'est pas un tableau, à vérifier.

Posté : 10 oct. 2005, 22:13
par Blustic
Comment ça tu peux etre plus précis stp car je comprens pas ce que tu veux dire.

Merci

Posté : 10 oct. 2005, 22:26
par Cyrano
foreach() va extraire les valeurs d'un tableau. la syntaxe peut donc être écrite comme suit:
foreach($tableau as $valeur)
{
    //...
}
Ce qui signifie en clair que la boucle va parcourir tout le contenu du tableau indexé ou associatif (tu fais la différence entre les deux ?) et en extraire chaque valeur. Les lignes d'instruction à chaque tour de boucle vont utiliser cette valeur.

Si j'ai par exemple le tableau suivant:
$tableau = array(1, 2, 3, 4, 5);
Je veux maintenant multiplier chaque valeur contenu par deux et les afficher. Je vais donc faire :
foreach($tableau as $nombre)
{
    echo("<p>". $nombre * 2 ."</p>\n");
}
Ce qui va me générer le code suivant:

Code : Tout sélectionner

<p>2</p> <p>4</p> <p>6</p> <p>8</p> <p>10</p>
Si je veux faire plus précis, je peux également extraire les clé, les index du tableau. Là, nous avons un tableau indexé, c'est à dire qu'il y a des index numériques automatiques à chaque ajoutd'une nouvelle valeur dans le tableau. Modifions notre boucle:
foreach($tableau as $index => $nombre)
{
    echo("<p>À l'index ". $index .", la valeur ". $nombre ." multipliée par 2 est égale à ". $nombre * 2 ."</p>\n");
}
Ce qui va générer le code:

Code : Tout sélectionner

<p>À l'index 0, la valeur 1 multipliée par 2 est égale à 2</p> <p>À l'index 1, la valeur 2 multipliée par 2 est égale à 4</p> <p>À l'index 2, la valeur 3 multipliée par 2 est égale à 6</p> <p>À l'index 3, la valeur 4 multipliée par 2 est égale à 8</p> <p>À l'index 4, la valeur 5 multipliée par 2 est égale à 10</p>
Est-ce que tu comprends mieux comme ça ?

Posté : 10 oct. 2005, 22:28
par Truc
Salut, verifi que le tableau n'est pas vide
$nb_elements = count ($a_classment);

Posté : 11 oct. 2005, 08:24
par Steffy
En faite ya juste 2 petites erreurs....
foreach ($a_classment as $point => $nom) {
echo "<li>".$nom." - ".$points." point(s)</li>";
}
Un S en trop a $point et ... il manque un E a classement