Faire un classement par point !

blustic
Invité n'ayant pas de compte PHPfrance

10 oct. 2005, 17:43

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

ViPHP
pjl
ViPHP | 2119 Messages

10 oct. 2005, 17:54

Une base de données ?

Mammouth du PHP | 568 Messages

10 oct. 2005, 17:55

Sinon, si tu veux pas de bdd, passe par les fonctions de tri de tableau... Comme asort()
Heddi s'est remis à développer pour lui même !
Martina Hingis - Étoile du Tennis
Heddi v. 2007

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 oct. 2005, 17:56

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>
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

blustic
Invité n'ayant pas de compte PHPfrance

10 oct. 2005, 18:15

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

Mammouth du PHP | 568 Messages

10 oct. 2005, 18:22

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...
Heddi s'est remis à développer pour lui même !
Martina Hingis - Étoile du Tennis
Heddi v. 2007

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 oct. 2005, 19:05

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>
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

blustic
Invité n'ayant pas de compte PHPfrance

10 oct. 2005, 19:24

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 ?>

blustic
Invité n'ayant pas de compte PHPfrance

10 oct. 2005, 19:27

Quand vous dites index

Qu'est-ce que c'est ??

Merci

blustic
Invité n'ayant pas de compte PHPfrance

10 oct. 2005, 21:04

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

Mammouth du PHP | 19672 Messages

10 oct. 2005, 21:06

À priori, la variable testée n'est pas un tableau, à vérifier.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Blustic
Invité n'ayant pas de compte PHPfrance

10 oct. 2005, 22:13

Comment ça tu peux etre plus précis stp car je comprens pas ce que tu veux dire.

Merci

Mammouth du PHP | 19672 Messages

10 oct. 2005, 22:26

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

10 oct. 2005, 22:28

Salut, verifi que le tableau n'est pas vide
$nb_elements = count ($a_classment);

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 55 Messages

11 oct. 2005, 08:24

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