Trier un tableau à double dimension ?

Trier un tableau à double dimension ? - PHP - Programmation

Marsh Posté le 07-05-2007 à 11:55:50    

Comment peut on trier un tableau à double dimension en fonction d'un seul champs uniquement.  
 
J'ai regardé la fonction array_multisort, mais malheuresement cela ne repond pas à mon besoin.
 
Voici un exemple pour vous montrer ce que je veux obtenir. Je veux trier mon tableau en fonction du champ libelle.
 
 
Tableau non triée :
 

Code :
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [date] => 2007-04-19 20-04-57
  6.             [libelle] => Appel
  7.             [destination] => 067627154
  8.             [montant] => -0.026 €
  9.             [compte] => 30j
  10.             [duree] => 6
  11.         )
  12.     [1] => Array
  13.         (
  14.             [date] => 2007-04-19 19-57-40
  15.             [libelle] => SMS
  16.             [destination] => 061459952
  17.             [montant] => -1.267 €
  18.             [compte] => 30j
  19.             [duree] => 288
  20.         )
  21.     [2] => Array
  22.         (
  23.             [date] => 2007-04-16 19-56-45
  24.             [libelle] => Appel
  25.             [destination] => 067627154
  26.             [montant] => -0.031 €
  27.             [compte] => 30j
  28.             [duree] => 7
  29.         )
  30. )


 
 
 
Tableau tréi en fonction du libelle.  

Code :
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [date] => 2007-04-19 20-04-57
  6.             [libelle] => Appel
  7.             [destination] => 067627154
  8.             [montant] => -0.026 €
  9.             [compte] => 30j
  10.             [duree] => 6
  11.         )
  12.     [1] => Array
  13.         (
  14.             [date] => 2007-04-16 19-56-45
  15.             [libelle] => Appel
  16.             [destination] => 067627154
  17.             [montant] => -0.031 €
  18.             [compte] => 30j
  19.             [duree] => 7
  20.         )
  21.     [2] => Array
  22.         (
  23.             [date] => 2007-04-19 19-57-40
  24.             [libelle] => SMS
  25.             [destination] => 061459952
  26.             [montant] => -1.267 €
  27.             [compte] => 30j
  28.             [duree] => 288
  29.         )
  30. )

Reply

Marsh Posté le 07-05-2007 à 11:55:50   

Reply

Marsh Posté le 07-05-2007 à 11:58:41    

usort.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 07-05-2007 à 13:28:17    

ca fonctionne du tonnerre, merci  
 
 
function compare ($a, $b)
{
 if ($a["libelle"] < $b["libelle"])
  return -1;
 else
  return 1;
 
 
}
usort($tab, "compare" );
 
 

Reply

Marsh Posté le 25-05-2007 à 16:45:18    

Bonjour,

 

J'aimerais faire un tri par libelle, puis par date.

 

Comment faire ?

 

J'ai essayer de faire dans un premier temps, un tri par libelle :

 

Code :
  1. function compare ($a, $b)
  2. {
  3.  if ($a["libelle"] < $b["libelle"])
  4.   return -1;
  5.  else
  6.   return 1;
  7. }
  8. usort($input, "compare" );
 

puis je fais mon tri par date des enregistrements qui ont un meme libelle.
 

Code :
  1. function compare2 ($a, $b)
  2. {
  3.  if ($a["libelle"] == $b["libelle"])
  4.  {
  5.   if($a["date"] < $b["date"])
  6.    return 1;
  7.   else
  8.    return -1;
  9.  }
  10.  else
  11.   return 0;
  12. }
  13. usort($input, "compare2" );
 

mais cela ne fonctionne pas

Message cité 1 fois
Message édité par weed le 25-05-2007 à 16:45:38
Reply

Marsh Posté le 25-05-2007 à 16:59:48    

weed a écrit :

mais cela ne fonctionne pas

forcément il te manque la comparaison des libelles lorsqu'ils ne sont pas égaux

Reply

Marsh Posté le 25-05-2007 à 17:04:05    

et bien si les libelles sont differents, il ne faut pas faire de tri. Je retourne donc 0 dans compare2.
 
Ca ne te parait pas correct comme principe ?

Reply

Marsh Posté le 25-05-2007 à 17:06:50    

ha tu utilises les 2 fonctions à la suite, je n'avais pas capté...
une seule fonction 'compare' suffit
 

Reply

Marsh Posté le 25-05-2007 à 17:14:12    

wala, une seule fonction, et tu traites tous les cas dans la même. Sinon tu tries 2 fois avec des critères différents.:o


Message édité par skeye le 25-05-2007 à 17:14:34

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 25-05-2007 à 17:20:44    

Euhhh comment ca, il faut dans un premier temps trier par libelle puis une fois la première faite il faut trier par date.
 
mais je ne vois pas comment on peux trier en 1 seule passe.

Reply

Marsh Posté le 25-05-2007 à 17:29:52    

weed a écrit :

Euhhh comment ca, il faut dans un premier temps trier par libelle puis une fois la première faite il faut trier par date.

 

mais je ne vois pas comment on peux trier en 1 seule passe.

 

Tu réfléchis pas assez.:o

 

[du code faux]


Message édité par skeye le 25-05-2007 à 17:37:04

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 25-05-2007 à 17:29:52   

Reply

Marsh Posté le 25-05-2007 à 17:35:40    

(si les libellés sont identiques, ça ne veut pas dire que tes éléments sont égaux, ça veut dire que tu dois passer au critère de tri suivant.:o)


Message édité par skeye le 25-05-2007 à 17:35:50

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 25-05-2007 à 17:39:44    

Tiens, teste ça pour voir:

Code :
  1. function compare ($a, $b)
  2. {
  3.  if ($a["libelle"] < $b["libelle"]){
  4.    return -1;
  5.  }
  6.  else{
  7.    if ($a["libelle"] == $b["libelle"])
  8.      {
  9.     if($a["date"] < $b["date"])
  10.       return 1;
  11.     else{
  12.       if($a["date"] > $b["date"]){      
  13.         return -1;
  14.       }
  15.       else{
  16.         return 0;
  17.       }
  18.     }
  19.    else
  20.      return 1;
  21.      }
  22.  }
  23. }


Message édité par skeye le 25-05-2007 à 17:40:52

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 25-05-2007 à 17:55:25    

ca a l'air de fonctionner ton 2ème code. Je vais reflechir un peu plus tard comment tu as fais.

Reply

Marsh Posté le 25-05-2007 à 18:16:22    

weed a écrit :

ca a l'air de fonctionner ton 2ème code. Je vais reflechir un peu plus tard comment tu as fais.


J'ai fait exactement ce pour quoi la fonction passée à usort est faite : j'ai trié 2 éléments l'un par rapport à l'autre, en traitant tous les cas.:o


---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

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