problème usort() avec un tableau de 1000 - 2000 lignes

problème usort() avec un tableau de 1000 - 2000 lignes - PHP - Programmation

Marsh Posté le 15-11-2007 à 17:27:35    

Voila je souhaite trier un tableau de valeur.
 
J'utilise usort avec un teableau qui contient ce genre de trucs
 TH   PRODUITTEST   PRODUIT  1500 €    PAR PRO 01/01/2007 45
 

Code :
  1. ---
  2. usort($tableau_info,"compare" );
  3. ---
  4. function compare($a,$b){
  5. global $tri;
  6. global $ordre;
  7. if($tri == "prix" || $tri == "dispo" ){
  8.  if($ordre == "ascending" ){
  9.   if($a['prix'] < $b['prix'])return  -1;
  10.   else return 1;
  11.  }
  12.  if($ordre == "descending" ){
  13.   if($a['prix'] > $b['prix'])return  -1;
  14.   else return 1;
  15.  }
  16. }elseif($tri == "date_depart" ){
  17.  $tempdate1 = explode("-",$a['date_depart']);
  18.  $tempdate2 = explode("-",$b['date_depart']);
  19.  if($ordre == "ascending" ){
  20.   if(mktime(0,0,0,(int)$tempdate1[1],(int)$tempdate1[2],(int)$tempdate1[0]) < mktime(0,0,0,(int)$tempdate2[1],(int)$tempdate2[2],(int)$tempdate2[0]))return  -1;
  21.   else return 1;
  22.  }
  23.  if($ordre == "descending" ){
  24.   if(mktime(0,0,0,(int)$tempdate1[1],(int)$tempdate1[2],(int)$tempdate1[0]) > mktime(0,0,0,(int)$tempdate2[1],(int)$tempdate2[2],(int)$tempdate2[0]))return  -1;
  25.   else return 1;
  26.  }
  27. }
  28. else{
  29.  if($ordre == "ascending" ){
  30.   return strcasecmp($a[$tri],$b[$tri]);
  31.  }
  32.  if($ordre == "descending" ){
  33.   return !strcasecmp($a[$tri],$b[$tri]);
  34.  }
  35. }
  36. }


 
Sauf que quand on passe a 1000-2000 lignes, le usort il fait bobo au serveur en dépassant allegrement les 30 sec d'execution du script.
Vous avez une autre proposition d'utilisation d'un algo de tri de tableau avec les trucs que j'ai spécifié dans la fonction compare?
Faut impérativement que ca marche pareil que dans l'état la, mais en plus vite en fait.

Reply

Marsh Posté le 15-11-2007 à 17:27:35   

Reply

Marsh Posté le 16-11-2007 à 18:06:52    

Tu les récupères comment tes données :??:

Reply

Marsh Posté le 16-11-2007 à 19:07:11    

C'est juste un tableau, je le choppe en base de donnée.
Et donc je veux le trier en fonction des colones.
Ce que je fais avec usort() et une fonction compare customisée.
Mais c'est très long.

Reply

Marsh Posté le 17-11-2007 à 01:55:53    

Déja pour les tris par date, tu peux faire une simple comparaison de chaînes ("2001-04-02" > "1998-12-28" ) et virer 7-8 lignes... Voire les retourner en compact ("20010402 > 19981228) et faire une comp de nombres c'est ptet plus rapide...
 
Sinon c'est en utilisant quel tri que ça rame ? tous ?
T'as pas moyen de le faire direct en SQL ?
 
Enfin 30 sec pour que 2000 lignes c'est quand même bizarre (jamais testé cela dit)


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 18-11-2007 à 02:13:20    

BAh si ça vient d'une base de donnée, tu fais tes tris directement en sql et tout ira bien mieux ;)

Reply

Marsh Posté le 18-11-2007 à 10:03:03    

Oui c'est une possibilité, pas trop adaptée dans mon cas vu l'archi de mon code ( jvais pas tout vous expliquer :p ).
Mais ya pas un autre algo de tri? style que le php soit pas obligé de parcourir tout le tableau a chaque fois pour trouver ou placer sa valeur?

Reply

Marsh Posté le 21-11-2007 à 05:09:26    

Si tu dis pas tout, on pense pas tout :p

Reply

Marsh Posté le 22-11-2007 à 10:23:26    

En gros j'ai plusieurs tables, et je peux pas faire un traitement direct sur les infos qui sortent des requetes vu que les différentes requetes ne sont pas liées entre elles.
Comme c'est pas clair :p :
SELECT gna gna FROM gna gna ORDER BY gna gna
SELECT truc FROM truc ORDER BY truc
 
Mais truc et gna font partie d'une même ligne de tableau. Donc les tri par requetes sont pas possibles.
Ici "1500" et "€" ne viennent pas de la même table que "Th" et "PRODUITTEST", meme si ils correspondent tous a la même ligne.


Message édité par Decapfour le 22-11-2007 à 10:24:53
Reply

Marsh Posté le 22-11-2007 à 15:32:29    

Tu connais les jointures de tables ?


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 22-11-2007 à 19:42:51    

J'ai plusieurs requetes sur truc et une sur gna, le tout n fois, ou n est dynamique.

Reply

Marsh Posté le 22-11-2007 à 19:42:51   

Reply

Marsh Posté le 23-11-2007 à 12:50:14    

Tu veux dire qu'une jointure ne marcherait pas ?

 

Je mets ma main à couper que tu peux faire le tout en une seule requete.


Message édité par theredled le 23-11-2007 à 12:50:45

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Sujets relatifs:

Leave a Replay

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