Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1896 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Aide pour tri de tableau multi-dimensionnel

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Aide pour tri de tableau multi-dimensionnel

n°1110737
nero27
Posté le 07-06-2005 à 11:24:44  profilanswer
 

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
mood
Publicité
Posté le 07-06-2005 à 11:24:44  profilanswer
 

n°1110801
nero27
Posté le 07-06-2005 à 11:53:34  profilanswer
 

[:japy]

n°1110807
cesarr89
Posté le 07-06-2005 à 11:56:43  profilanswer
 


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

n°1110811
Berceker U​nited
PSN : berceker_united
Posté le 07-06-2005 à 11:57:37  profilanswer
 

Regarde dans la doc.
Doc

n°1110922
nero27
Posté le 07-06-2005 à 12:33:23  profilanswer
 

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 ;)

n°1110964
nero27
Posté le 07-06-2005 à 12:59:08  profilanswer
 

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.

n°1112228
nero27
Posté le 08-06-2005 à 10:11:39  profilanswer
 

Quelqu'un a une idée ?

n°1117114
Berceker U​nited
PSN : berceker_united
Posté le 12-06-2005 à 12:58:39  profilanswer
 

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.

n°1117213
nero27
Posté le 12-06-2005 à 15:04:19  profilanswer
 

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

n°1117273
Berceker U​nited
PSN : berceker_united
Posté le 12-06-2005 à 16:18:38  profilanswer
 

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.

mood
Publicité
Posté le 12-06-2005 à 16:18:38  profilanswer
 

n°1117842
nero27
Posté le 13-06-2005 à 09:14:31  profilanswer
 

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
n°1118035
Berceker U​nited
PSN : berceker_united
Posté le 13-06-2005 à 11:25:56  profilanswer
 

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.

n°1118043
nero27
Posté le 13-06-2005 à 11:29:34  profilanswer
 

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) :/

n°1118267
Berceker U​nited
PSN : berceker_united
Posté le 13-06-2005 à 13:26:35  profilanswer
 

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.

n°1118281
nero27
Posté le 13-06-2005 à 13:36:46  profilanswer
 

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

n°1118383
ratibus
Posté le 13-06-2005 à 15:12:29  profilanswer
 

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
n°1118431
nero27
Posté le 13-06-2005 à 15:32:42  profilanswer
 

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

n°1118444
ratibus
Posté le 13-06-2005 à 15:37:59  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Aide pour tri de tableau multi-dimensionnel

 

Sujets relatifs
SQL Access PHP[VB6] Se placer aléatoirement sur une cellule d'un tableau
Probleme PHP http, excelAide SDL : Problème de clic de souris... (titre modifié)
[PHP/MySQL] tri sur deux bdd en même tempsAide pour un site sous SPIP
Passer un tableau a un autre fichier[PHP/MySQL] Comment afficher les sauts de ligne d'une TEXTAREA?
[PERL] Aide SVP pour recharger un script perl[MySQL] Delete multi-tables
Plus de sujets relatifs à : [PHP] Aide pour tri de tableau multi-dimensionnel


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR