[resolu] Tri dans un tableau multidimensionnel

Tri dans un tableau multidimensionnel [resolu] - PHP - Programmation

Marsh Posté le 02-04-2006 à 22:50:23    

Alors voilà mon petit problème... J'ai d'un coté des dates au format "jj/mm/aaaa HH:MM:SS", de l'autre une fonction de tri que j'ai faite... Sauf qu'avec un usort( $data['date'],"comparedate" )  ca ne trie que le sous-array 'date' ce qui evidemment pose problème pour l'affichage des données. Voici le code :
 

Code :
  1. {
  2. $annee1=$date1[6].$date1[7].$date1[8].$date1[9];
  3. settype($annee1,"integer" );
  4. $annee2=$date2[6].$date2[7].$date1[8].$date1[9];
  5. settype($annee2,"integer" );
  6. If ($annee2<$annee1) {return -1;}
  7. If ($annee2>$annee1) {return 1;}
  8. else {
  9. $mois1=$date1[3].$date1[4];
  10. settype($mois1,"integer" );
  11. $mois2=$date2[3].$date2[4];
  12. settype($mois2,"integer" );
  13.  If ($mois2<$mois1) {return -1;}
  14.  If ($mois2>$mois1) {return 1;}
  15.  else {
  16.  $jour1=$date1[0].$date1[1];
  17.  settype($jour1,"integer" );
  18.  $jour2=$date2[0].$date2[1];
  19.  settype($jour2,"integer" );
  20.   If ($jour2<$jour1) {return -1;}
  21.   If ($jour2>$jour1) {return 1;}
  22.   else {
  23.   $heure1=$date1[11].$date1[12];
  24.   settype($heure1,"integer" );
  25.   $heure2=$date2[11].$date2[12];
  26.   settype($heure2,"integer" );
  27.    If ($heure2<$heure1) {return -1;}
  28.    If ($heure2>$heure1) {return 1;}
  29.    else {
  30.    $minute1=$date1[14].$date1[15];
  31.    settype($minute1,"integer" );
  32.    $minute2=$date2[14].$date2[15];
  33.    settype($minute2,"integer" );
  34.     If ($minute2<$minute1) {return -1;}
  35.     If ($minute2>$minute1) {return 1;}
  36.     else {
  37.     $seconde1=$date1[17].$date1[18];
  38.     settype($seconde1,"integer" );
  39.     $seconde2=$date2[17].$date2[18];
  40.     settype($seconde2,"integer" );
  41.      If ($seconde2<$seconde1) {return -1;}
  42.      If ($seconde2>$seconde1) {return 1;}
  43.      else {return 0;}
  44.     }
  45.    }
  46.   }
  47.  }
  48. }
  49. }
  50. $request=mysql_query($request);
  51. $nbmsg=mysql_num_rows($request);
  52. for ($i=0;$i<$nbmsg;$i++)
  53. {
  54. $data['id'][$i]=mysql_result($request, $i, "id" );
  55. $data['titre'][$i]=mysql_result($request, $i, "titre" );
  56. $data['date'][$i]=mysql_result($request, $i, "date" );
  57. $data['message'][$i]=mysql_result($request, $i, "message" );
  58. $data['expediteur'][$i]=mysql_result($request, $i, "expediteur" );
  59. $data['seen_from_des'][$i]=mysql_result($request, $i, "seen_from_des" );
  60. }
  61. usort($data['date'],"comparedate" );


 
Donc voilà si quelqu'un veut bien m'expliquer comment faire en sorte de trier tout le tableau en fonction de la date (et je tiens à le faire via se procédé pour pouvoir faire des tris selon d'autres critères), je lui en serait bien reconnaissant ;)


Message édité par Yagmoth le 03-04-2006 à 11:34:54
Reply

Marsh Posté le 02-04-2006 à 22:50:23   

Reply

Marsh Posté le 03-04-2006 à 09:34:25    

en fait ton tableau tu l'as pas fait dans le bon sens ( disons que personellement je l'aurais fait dans l'autre ;) ).
Au lieu de:

Code :
  1. $data['id'][$i]...


J'aurais fait

Code :
  1. $data[$i]['id']...


ça parait identique mais ça change tout, enfin pas tout, disons que ça simplifie la fonction usort  
 
Après tu peux faire un truc comme ça dans ta fonction:

Code :
  1. function cmpDate($a, $b){
  2.     if ($a['date'] == $b['date']) {
  3.        return 0;
  4.    }
  5.    return ($a['date'] < $b['date]) ? -1 : 1;
  6. }


et zou on en parlait plus!
}

Reply

Marsh Posté le 03-04-2006 à 10:58:44    

Alors j'ai procédé comme conseillé et ca à l'air de mieux marcher mais il subsiste une série d'erreur localisé bizarrement sur la ligne qui définit $annee2 :
 
Notice: Undefined offset: 6 in c:\program files\easyphp1-8\www\petites annonces\mp\inbox2.php on line 60
 
Notice: Undefined offset: 7 in c:\program files\easyphp1-8\www\petites annonces\mp\inbox2.php on line 60
 
Notice: Undefined offset: 8 in c:\program files\easyphp1-8\www\petites annonces\mp\inbox2.php on line 60
 
Notice: Undefined offset: 9 in c:\program files\easyphp1-8\www\petites annonces\mp\inbox2.php on line 60
 
Répété pour chaque comparaison evidemment. Voici le code remanié :
 

Code :
  1. function comparedate($date1,$date2)
  2. {
  3. $date1=$date1['date'];
  4. $date1=$date2['date'];
  5. $annee1=$date1[6].$date1[7].$date1[8].$date1[9];
  6. settype($annee1,"integer" );
  7. $annee2=$date2[6].$date2[7].$date2[8].$date2[9];
  8. settype($annee2,"integer" );
  9. If ($annee2<$annee1) {return -1;}
  10. If ($annee2>$annee1) {return 1;}
  11. else {
  12. $mois1=$date1[3].$date1[4];
  13. settype($mois1,"integer" );
  14. $mois2=$date2[3].$date2[4];
  15. settype($mois2,"integer" );
  16.  If ($mois2<$mois1) {return -1;}
  17.  If ($mois2>$mois1) {return 1;}
  18.  else {
  19.  $jour1=$date1[0].$date1[1];
  20.  settype($jour1,"integer" );
  21.  $jour2=$date2[0].$date2[1];
  22.  settype($jour2,"integer" );
  23.   If ($jour2<$jour1) {return -1;}
  24.   If ($jour2>$jour1) {return 1;}
  25.   else {
  26.   $heure1=$date1[11].$date1[12];
  27.   settype($heure1,"integer" );
  28.   $heure2=$date2[11].$date2[12];
  29.   settype($heure2,"integer" );
  30.    If ($heure2<$heure1) {return -1;}
  31.    If ($heure2>$heure1) {return 1;}
  32.    else {
  33.    $minute1=$date1[14].$date1[15];
  34.    settype($minute1,"integer" );
  35.    $minute2=$date2[14].$date2[15];
  36.    settype($minute2,"integer" );
  37.     If ($minute2<$minute1) {return -1;}
  38.     If ($minute2>$minute1) {return 1;}
  39.     else {
  40.     $seconde1=$date1[17].$date1[18];
  41.     settype($seconde1,"integer" );
  42.     $seconde2=$date2[17].$date2[18];
  43.     settype($seconde2,"integer" );
  44.      If ($seconde2<$seconde1) {return -1;}
  45.      If ($seconde2>$seconde1) {return 1;}
  46.      else {return 0;}
  47.     }
  48.    }
  49.   }
  50.  }
  51. }
  52. }
  53. $request=mysql_query($request);
  54. $nbmsg=mysql_num_rows($request);
  55. for ($i=0;$i<$nbmsg;$i++)
  56. {
  57. $data[$i]['id']=mysql_result($request, $i, "id" );
  58. $data[$i]['titre']=mysql_result($request, $i, "titre" );
  59. $data[$i]['date']=mysql_result($request, $i, "date" );
  60. $data[$i]['message']=mysql_result($request, $i, "message" );
  61. $data[$i]['expediteur']=mysql_result($request, $i, "expediteur" );
  62. $data[$i]['seen_from_des']=mysql_result($request, $i, "seen_from_des" );
  63. }
  64. usort($data,"comparedate" );


 
Comme résultat, j'ai bien une remontée en avant du message le plus récent...jusqu'à la deuxieme ligne au lieu d'atterir en tout premier, ce qui doit venir de la nom comparaison à un moment. Donc si quelqu'un a une idée ;)
 
Merci d'avance :)

Reply

Marsh Posté le 03-04-2006 à 11:34:23    

Edit c'est bon c'est résolu, je devrais pas programmer le matin :D (cf erreur ligne 5 où j'ai mis un $date1 au lieu de $date2). Merci encore à anapajari ;)

Reply

Marsh Posté le 03-04-2006 à 11:36:20    

Disons que ta fonction de comparaison des dates est bien compliquée alors qu'on peut faire très simple, quelque chose dans le genre:

Code :
  1. function comparedate($a, $b){
  2. $dateA = strtotime(preg_replace('#^(\d\d)/(\d\d)#','$2/$1', $a));
  3. $dateB = strtotime(preg_replace('#^(\d\d)/(\d\d)#','$2/$1', $b));
  4. if ($dateA == $dateB) {
  5.      return 0;
  6. }
  7. return ($dateA < $dateB) ? -1 : 1;
  8. }


 
edit: evidement grilled, reste néanmoins que ma fonction est plus simple que la tienne :o


Message édité par anapajari le 03-04-2006 à 11:38:03
Reply

Marsh Posté le 03-04-2006 à 11:51:42    

J'avoue que moi et les expressions régulière... :D Et aussi que je ne savais pas trop dans quel format mettre la date pour que PHP puisse la comparer.

Reply

Marsh Posté le 03-04-2006 à 12:10:51    

Bin tu pouvais le faire sans regex et sans le format de date juste en te servant de strcmp et substr

Code :
  1. function comparedate($a,$b){
  2. /*** on reformate les dates en AAAAMMJJHHMMSS et on les compare ***/
  3. return strcmp (
  4. substr($a['date'],6,4).substr($a['date'],3,2).substr($a['date'],0,2).substr($a['date'],11,2).substr($a['date'],14,2).substr($a['date'],17,2),
  5. substr($b['date'],6,4).substr($b['date'],3,2).substr($b['date'],0,2).substr($b['date'],11,2).substr($b['date'],14,2).substr($b['date'],17,2)
  6. );
  7. }


 
En fait tout ce que je veux dire c'est qu'il existe 10.000 façons de le faire, mais que la la doc ça roxxe et que tu devrais toujours commencer par chercher dedans si il n'y a pas une solution toute faite ( qui sera forcément plus optimisée que la tienne)!!!


Message édité par anapajari le 03-04-2006 à 12:12:04
Reply

Marsh Posté le 03-04-2006 à 12:13:34    

En effet... Disons que j'aurai surtout du réfléchir à comment faire pour faire une seule comparaison au lieu de bourriner :D Merci ;)

Reply

Sujets relatifs:

Leave a Replay

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