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

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1643521
Decapfour
Posté le 15-11-2007 à 17:27:35  profilanswer
 

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.

mood
Publicité
Posté le 15-11-2007 à 17:27:35  profilanswer
 

n°1644184
leflos5
On est ou on est pas :)
Posté le 16-11-2007 à 18:06:52  profilanswer
 

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

n°1644213
Decapfour
Posté le 16-11-2007 à 19:07:11  profilanswer
 

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.

n°1644316
theredled
● REC
Posté le 17-11-2007 à 01:55:53  profilanswer
 

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
n°1644587
leflos5
On est ou on est pas :)
Posté le 18-11-2007 à 02:13:20  profilanswer
 

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

n°1644601
Decapfour
Posté le 18-11-2007 à 10:03:03  profilanswer
 

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?

n°1646215
leflos5
On est ou on est pas :)
Posté le 21-11-2007 à 05:09:26  profilanswer
 

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

n°1647030
Decapfour
Posté le 22-11-2007 à 10:23:26  profilanswer
 

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
n°1647310
theredled
● REC
Posté le 22-11-2007 à 15:32:29  profilanswer
 

Tu connais les jointures de tables ?


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1647602
Decapfour
Posté le 22-11-2007 à 19:42:51  profilanswer
 

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

mood
Publicité
Posté le 22-11-2007 à 19:42:51  profilanswer
 

n°1647880
theredled
● REC
Posté le 23-11-2007 à 12:50:14  profilanswer
 

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

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

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

 

Sujets relatifs
Créer un tableau en C (très simple mais pas pour moi...)probléme de compilation avec code::blocks
Problème avec héritage et méthode virtuelleProbleme boucle (debutant) Urgennttttttt
probleme table de hachage dans requete findProblème de cration d'un thème pour mon site
probleme de tri de la base de donnée (colonne)[Résolu] Problème de chargement d'image
probleme expressions regulieres phpProbleme de chagement SWF
Plus de sujets relatifs à : problème usort() avec un tableau de 1000 - 2000 lignes


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