Php, classement tableau

Php, classement tableau - PHP - Programmation

Marsh Posté le 27-03-2009 à 14:00:18    

Bonjour,  
 
J'ai un tableau comme ceci que je souhaite trier dans l'ordre décroissant puis faire un classement numéroté 1,2,3,..
 
J'ai essayé avec array_multisort mais ca ne me donne pas le bon tri.
 

Code :
  1. $score[$i][$nom]['points']=$total;
  2. array_multisort($score, SORT_NUMERIC, SORT_DESC);
  3. print_r($score);


 
J'ai obtenu ceci:  
Array ( [0] => Array ( [Pa] => Array ( [points] => 1 ) ) [1] => Array ( [To] => Array ( [points] => 4 ) ) [2] => Array ( [Ca] => Array ( [points] => 5 ) ) [3] => Array ( [Ma] => Array ( [points] => 0 ) ) )
 
ET j'ai un message d'erreur lorsque je tente de réaliser un classement:  
 

Code :
  1. $b=count($score);
  2. for($a = 1; $a = $b; $a++) {
  3.  $score[$i][$nom]=$a;}


 
 
Comment puis je  faire un classement ?
 
Merci d'avance

Reply

Marsh Posté le 27-03-2009 à 14:00:18   

Reply

Marsh Posté le 27-03-2009 à 18:06:12    

Si je capte bien, tu veux trier tes $noms en fonction de leurs points ?
 
Si c'est le cas, le tri de la 2ème dimension dépend de la 3ème et donc le multisort ne peut pas t'aider.
Ceci-dit, je ne suis pas complètement certain de la judicieusité d'un tableau à 3 dimensions pour ce que tu veux faire.
 
Une solution pas très propre avec ton tableau à 3 dimensions:
 

Code :
  1. $tmp = array();
  2. foreach($score as $k1 => $lvl_1_arr)
  3. {
  4.  foreach($lvl_1_arr as $nom => $nom_arr)
  5.  {
  6.     $tmp[str_pad($nom_arr['points'], 20, '0', STR_PAD_LEFT).$nom.$k1] = array('nom' => $nom, 'points' => $nom_arr['points']);
  7.  }
  8. }
  9. krsort($tmp);
  10.  
  11. $i = 1;
  12. foreach($tmp as $arr)
  13. {
  14.  echo $i.' position: '.$arr['nom'].' ('.$arr['points'].')<br />';
  15.  $i++;
  16. }


 
Sinon, en 1 dimension:
 

Code :
  1. $score = array();
  2.  
  3. while($on_a_des_scores_a_mettre)
  4. {
  5.  $score[$id_unique_du_joueur] = array('id' => $id_unique_du_joueur', 'nom' => $nom, 'points' => $points');
  6. }
  7.  
  8. $r = array();
  9. foreach($score as $id => $arr)
  10. {
  11.  $r[$id] = $arr['points'];
  12. }
  13. asort($r);
  14.  
  15. $i = 1;
  16. foreach($r as $id => $points)
  17. {
  18.  echo $i.' position: '.$score[$id]['nom'].' ('.$score[$id]['points'].')<br />';
  19.  $i++;
  20. }


 
C'est évidemment TRES TRES optimisable (par exemple en utilisant la PHP SPL http://fr3.php.net/spl  )


---------------
http://www.gabouel.com
Reply

Marsh Posté le 27-03-2009 à 18:42:42    

Bonjour,  
 
Merci de m'avoir répondu, je vais essayer votre code.  
En effet, j'aimerais trier les noms en fonction des points et les classer, tableau donc à une dimension:  
$score[$nom]=$total;
Je n'ai pas bien compris la solution à 1 dimension lorsque vous mettez:  
$score = array();
while($on_a_des_scores_a_mettre)
{
 $score[$id_unique_du_joueur] = array('id' => $id_unique_du_joueur', 'nom' => $nom, 'points' => $points');
}
et si dans le cas de l'égalité des points entre deux équipes, la différence de buts détermine le classement, j'aurai deux dimensions?
$score[$nom]=$diffbut;
 
Merci beaucoup

Reply

Marsh Posté le 27-03-2009 à 21:53:10    

Bonsoir,  
 
La solution du tableau à 3 dimensions fonctionne. Merci beaucoup. Je n'ai pas réussi à faire avec celle d'une dimension.  
 
J'aimerais savoir en cas d'égalité des points comment trier en sorte que la différence de buts détermine le rang  
différence de buts= buts marqués-buts encaissés
 
Si équipe A et B ont toutes les deux 5 points,  
Diff de buts A = -3
diff de buts B= -5  
alors A est classé avant B
 
Je vous remets le code avec la différence de buts:  

Code :
  1. $tmp = array();
  2.       foreach($score as $k1 => $lvl_1_arr)
  3.       {
  4.        foreach($lvl_1_arr as $nom => $nom_arr)
  5.        {
  6.           $tmp[str_pad($nom_arr['points'], 20, '0', STR_PAD_LEFT).$nom.$k1] = array('nom' => $nom, 'points' => $nom_arr['points'], 'diffbut' => $nom_arr['diffbut']);
  7.        }
  8.       }
  9.       krsort($tmp);
  10. $i = 1;
  11.       foreach($tmp as $arr)
  12.       {
  13.   ?><tr><td><?php
  14.        echo $i.' '.$arr['nom'];
  15.    ?></td><td><?php
  16.    echo $arr['points'];
  17.    ?></td><td><?php
  18.    echo $arr['diffbut'];
  19.    ?></td></tr><?php
  20.        $i++;
  21.       }


 
Merci beaucoup


Message édité par huy15 le 31-03-2009 à 00:29:52
Reply

Marsh Posté le 31-03-2009 à 00:38:33    

Bonsoir,  
 
Quelqu'un aurait il une idée?
 
Merci d'avance

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed