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

  FORUM HardWare.fr
  Programmation
  PHP

  [resolu] Tri dans un tableau multidimensionnel

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[resolu] Tri dans un tableau multidimensionnel

n°1337494
Yagmoth
Fanboy
Posté le 02-04-2006 à 22:50:23  profilanswer
 

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
mood
Publicité
Posté le 02-04-2006 à 22:50:23  profilanswer
 

n°1337565
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-04-2006 à 09:34:25  profilanswer
 

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!
}

n°1337616
Yagmoth
Fanboy
Posté le 03-04-2006 à 10:58:44  profilanswer
 

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

n°1337641
Yagmoth
Fanboy
Posté le 03-04-2006 à 11:34:23  profilanswer
 

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

n°1337644
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-04-2006 à 11:36:20  profilanswer
 

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
n°1337660
Yagmoth
Fanboy
Posté le 03-04-2006 à 11:51:42  profilanswer
 

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.

n°1337673
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-04-2006 à 12:10:51  profilanswer
 

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
n°1337676
Yagmoth
Fanboy
Posté le 03-04-2006 à 12:13:34  profilanswer
 

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


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

  [resolu] Tri dans un tableau multidimensionnel

 

Sujets relatifs
[résolu] .htaccess et php[résolu] comparer un float à 1
[résolu] selectionner le texte d un textbox ou positionner curseurProblème tableau HTML
Macro (Excel 2000) SetFocus (Résolu)Macro (Excel 2000) (Résolu)
[Résolu] Batch FTP avec pb de Date[RESOLU] Comment faire des liens vers les pages de son site?
cacher des lignes du tableau (display none) ?[RESOLU] Tri Tableau Multidimensionnel alimenté par LDAP [RESOLU]
Plus de sujets relatifs à : [resolu] Tri dans un tableau multidimensionnel


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