[PHP] Aide pour tri de tableau multi-dimensionnel

Aide pour tri de tableau multi-dimensionnel [PHP] - PHP - Programmation

Marsh Posté le 07-06-2005 à 11:24:44    

Voilà, j'ai un tableau de ce style :
 

Code :
  1. $tab = array(array(georges,30), array(marcel,15), array(gerard,45));


Je voudrais trier le tableau $tab de façon à ce que tous les tableaux qui le composent soient ordonnées par les valeurs numériques pour obtenir :
 

Code :
  1. $tab = array(array(marcel,15), array(georges,30), array(gerard,45));


 
Savez-vous s'il existe une fonction pour faire cela ?
Je peux toujours programmer le tri à la main, mais y'a surement plus simple.
 
Merci d'avance ;)


Message édité par nero27 le 07-06-2005 à 11:25:23
Reply

Marsh Posté le 07-06-2005 à 11:24:44   

Reply

Marsh Posté le 07-06-2005 à 11:53:34    

[:japy]

Reply

Marsh Posté le 07-06-2005 à 11:56:43    


 
Tu es vraiment pas patient.
 
Surtout que t'aurais eu le temps de le faire.

Reply

Marsh Posté le 07-06-2005 à 11:57:37    

Regarde dans la doc.
Doc

Reply

Marsh Posté le 07-06-2005 à 12:33:23    

cesarr89 a écrit :

Tu es vraiment pas patient.
 
Surtout que t'aurais eu le temps de le faire.


 
Je préfèrerais une vraie fonction, car la taille de mon tableau dépasse les 100000, alors je voudrais que ça soit optimisé :/
 

Berceker United a écrit :

Regarde dans la doc.
Doc


J'avais bien trouvé cette fonction dans la doc sur PHP.net, mais son utilité me paraissait moins évidente que l'explication de nexen.
Je vais regarder ça merci ;)

Reply

Marsh Posté le 07-06-2005 à 12:59:08    

Pour tester avec array_multisort(), j'ai fait ça :
 

Code :
  1. $a=array();
  2. for ($i=0;$i<10;$i++)
  3. {
  4. $a[$i]=array("paul".$i,rand(0,10));
  5. }
  6. var_dump($a);
  7. array_multisort($a[][1],SORT_DESC);
  8. var_dump($a);


 
Ca ne fonctionne pas, mais c'est pour vous donner une idée de ce que je veux faire.

Reply

Marsh Posté le 08-06-2005 à 10:11:39    

Quelqu'un a une idée ?

Reply

Marsh Posté le 12-06-2005 à 12:58:39    

Moi je pense que j'aurais décomposé les dimensions du tableau puis utilisé à chaque fois la fonction sort() puis je replace le tableau dans sa dimension.

Reply

Marsh Posté le 12-06-2005 à 15:04:19    

j'ai créé ma propre fonction de tri rapide et ça fonctionne, merci ^^

Reply

Marsh Posté le 12-06-2005 à 16:18:38    

nero27 a écrit :

j'ai créé ma propre fonction de tri rapide et ça fonctionne, merci ^^


Peux tu le mettre ici je pense que c'est le genre de chose qui va être beaucoup demandé. je le placerais dans le topic des tuto
si tu le veux bien.

Reply

Marsh Posté le 12-06-2005 à 16:18:38   

Reply

Marsh Posté le 13-06-2005 à 09:14:31    

Code :
  1. //fonction qui echange les enregistrements du tableau
  2. function echange($i,$j)
  3. {
  4. $GLOBALS["listmembre"];
  5. $tampon1=$GLOBALS["listmembre"][$i][0];
  6. $tampon2=$GLOBALS["listmembre"][$i][1];
  7. $tampon3=$GLOBALS["listmembre"][$i][2];
  8. $tampon4=$GLOBALS["listmembre"][$i][3];
  9. $GLOBALS["listmembre"][$i][0]=$GLOBALS["listmembre"][$j][0];
  10. $GLOBALS["listmembre"][$i][1]=$GLOBALS["listmembre"][$j][1];
  11. $GLOBALS["listmembre"][$i][2]=$GLOBALS["listmembre"][$j][2];
  12. $GLOBALS["listmembre"][$i][3]=$GLOBALS["listmembre"][$j][3];
  13. $GLOBALS["listmembre"][$j][0]=$tampon1;
  14. $GLOBALS["listmembre"][$j][1]=$tampon2;
  15. $GLOBALS["listmembre"][$j][2]=$tampon3;
  16. $GLOBALS["listmembre"][$j][3]=$tampon4;
  17. }
  18. //fonction qui fait un tri décroissant
  19. function trirapidedesc($G,$D)
  20. {
  21. if($D<=$G)
  22.  return;
  23. $val=$GLOBALS["listmembre"][$D][1];
  24. $g=$G-1;
  25. $d=$D;
  26. do
  27. {
  28.  while(($GLOBALS["listmembre"][++$g][1]>$val));
  29.  while(($GLOBALS["listmembre"][--$d][1]<$val)&&($d>$G));
  30.  if($g<$d)
  31.  echange($g,$d);
  32. }
  33. while($g<$d);
  34. echange($g,$D);
  35. trirapidedesc($G,$g-1);
  36. trirapidedesc($g+1,$D);
  37. }
  38. //fonction qui fait un tri croissant
  39. function trirapideasc($G,$D)
  40. {
  41. if($D<=$G)
  42.  return;
  43. $val=$GLOBALS["listmembre"][$D][1];
  44. $g=$G-1;
  45. $d=$D;
  46. do
  47. {
  48.  while(($GLOBALS["listmembre"][++$g][1]<$val));
  49.  while(($GLOBALS["listmembre"][--$d][1]>$val)&&($d>$G));
  50.  if($g<$d)
  51.  echange($g,$d);
  52. }
  53. while($g<$d);
  54. echange($g,$D);
  55. trirapideasc($G,$g-1);
  56. trirapideasc($g+1,$D);
  57. }
  58. //tableau de test
  59. $listmembre=array(array("bernard",12,"truc","chose" ),array("maurice",3,"machin","chose" ));
  60. trirapideasc(0,1);
  61. /*Résultat obtenu
  62. array(2) {  
  63.    [1]=> array(4) {  
  64.                     [0]=> string(7) "maurice"  
  65.                     [1]=> int(3)  
  66.                     [2]=> string(6) "machin"   
  67.                     [3]=> string(5) "chose"  
  68.                   }  
  69.    [0]=> array(4) {  
  70.                     [0]=> string(7) "bernard"  
  71.                     [1]=> int(12)  
  72.                     [2]=> string(4) "truc"  
  73.                     [3]=> string(5) "chose"  
  74.                   }  
  75. }
  76. */


Message édité par nero27 le 13-06-2005 à 09:16:17
Reply

Marsh Posté le 13-06-2005 à 11:25:56    

J'ai pas trop regardé dans les détails mais à premiere vu j'ai l'impression qu'il y a moyen de faire plus simple. Mais si sa marche tant mieux.

Reply

Marsh Posté le 13-06-2005 à 11:29:34    

Vu le type de tableau, y'a pas moyen de faire plus simple (pour éviter de mélanger toutes les cases des tableaux contenus dans le tableau principal) :/

Reply

Marsh Posté le 13-06-2005 à 13:26:35    

Je te fais cela de tête comme ça sans tester pour voir.
- Je boucle sur chaque élément de mon tableau et regarde si c'est pas une dimension ou des données.  
-Si dimension je rappelle ma fonction de façon récurcive.
-Si c'est une donnée je place dans un tableau temporaire et applique la fonction sort() puis je replace les éléments dans sa dimension.

Reply

Marsh Posté le 13-06-2005 à 13:36:46    

Non, on ne peut pas faire ça, sinon, tout se mélange :/

Reply

Marsh Posté le 13-06-2005 à 15:12:29    

Code :
  1. <?php
  2. function cmp($a, $b) {
  3.    if ($a[1] == $b[1]) return 0;
  4.    return $a[1] < $b[1] ? -1 : 1;
  5. }
  6. // Test
  7. $a=array();
  8. for ($i=0;$i<10;$i++) {
  9.    $a[$i]=array("paul".$i,rand(0,10));
  10. }
  11. print_r($a);
  12. // Tri
  13. usort($a, "cmp" );
  14. print_r($a);
  15. ?>


 
T'as 100 000 éléments dans ton tableau ?
 
Comment ça se fait ?
 
Si c'est lié à ceci : http://forum.hardware.fr/hardwaref [...] 1715-1.htm
c'est un problème de conception et/ou d'architecture (cf notre discussion sur encore un autre topic ;)).


Message édité par ratibus le 13-06-2005 à 15:25:11
Reply

Marsh Posté le 13-06-2005 à 15:32:42    

Non, je me suis trompé, j'ai 20 éléments à trier ;)

Reply

Marsh Posté le 13-06-2005 à 15:37:59    

C'est mieux :D
 
Je te conseille donc le code que je t'ai posté ;)

Reply

Sujets relatifs:

Leave a Replay

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