Tableau à trier en fct de deux champs - PHP - Programmation
Marsh Posté le 18-07-2006 à 10:50:51
Au lieu de faire un méga tableau de tableaux, conserve des tableaux indépendants mais parallèles et utilise array_multisort().
Marsh Posté le 18-07-2006 à 10:51:49
déjà si ça remonte de ta bdd pourquoi ne pas utiliser un order dans ta requête de select???
Ensuite si ce n'est pas possible, c'est exactement array_multisort dont tu as besoin, l'exemple 3 de la doc ( Example 3. Sorting database results) réponds entièrement à ta question: http://fr.php.net/array_multisort
Marsh Posté le 18-07-2006 à 11:08:02
anapajari a écrit : déjà si ça remonte de ta bdd pourquoi ne pas utiliser un order dans ta requête de select??? |
J'ai une requête par niveau et je ne connais pas à l'avance le dernier niveau donc je ne peux pas faire comme tu dis.
Je connais bien cet exemple mais il ne convient pas dans mon cas car ma "clef" est faite de deux champs alors que array_multisort ne fonctionne que sur un champ.
Dans l'exemple que j'ai donné, le multisort a été effectué car j'ai rangé par niveau et ensuite par lot_pere alors que je voudrais qu'il range par niveau ET lot_pere en même temps ce qui donnerait que l'indice 2 de mon tableau serait à la place de l'indice 1.
Ouais je sais, c'est relou les tableaux
Marsh Posté le 18-07-2006 à 11:10:12
Hermes le Messager a écrit : Au lieu de faire un méga tableau de tableaux, conserve des tableaux indépendants mais parallèles et utilise array_multisort(). |
Effectivement, ça serait une bonne idée mais je ne connais pas à l'avance combien j'aurai de tableau, tout est à la volée et c'est du récursif.
Peut on créer des tableaux à la volée et les réutiliser après ?
Du genre, $tab1, $tab2, $tab3, ...
Marsh Posté le 18-07-2006 à 11:14:28
NerOcrO a écrit : Effectivement, ça serait une bonne idée mais je ne connais pas à l'avance combien j'aurai de tableau, tout est à la volée et c'est du récursif. |
Oui c'est possible, tu les crés à la volée avec des ${'non_tableau'.$num} = array() et ensuite, tu construis via une boucle ton instruction PHP array_multisort() avec concaténation etc... Puis tu exécutes cette instruction via eval().
Ouai, c'est de la folie, mais ça marche.
Marsh Posté le 18-07-2006 à 11:33:42
bin fait un usort alors ça triera exactement comme tu le désires alors
un truc dans le genre:
Code :
|
Que tu utilises comme ça:
Code :
|
Marsh Posté le 18-07-2006 à 11:38:35
anapajari a écrit : bin fait un usort alors ça triera exactement comme tu le désires alors
|
Oui, j'étais en train de bosser dessus aussi
Ta fonction ne fonctionne pas (encore) mais j'y travaille !
Le but du jeu est d'avoir le niveau 0, puis le niveau 1, puis le niveau 2, ... du même lot père et ces mêmes niveaux peuvent avoir aussi des sous niveau d'où la complexité du truc.
Marsh Posté le 18-07-2006 à 11:57:24
NerOcrO a écrit : Oui, j'étais en train de bosser dessus aussi |
Tututututuuuu ma fonction fonctionne très bien
Code :
|
Donne
Array |
Maintenant ça trie peut-être pas dans l'ordre que tu voulais, mais je n'ai toujours pas compris quel était cet ordre ( Mais si c'est lot_pere qui est prioritaire sur le niveau, tu as juste a inversé les clés dans la fonction cmp)
Marsh Posté le 18-07-2006 à 13:05:49
Oui ton exemple fonctionne mais il est très simple.
Si tu construits ce tableau :
Code :
|
Tu as comme résultat :
Code :
|
Or je voudrai :
Code :
|
Note : la construction du tableau se fera toujours pareils, j'empile les niveaux au fur et à mesure.
Marsh Posté le 18-07-2006 à 13:14:56
J'ai presque quelque chose avec ceci :
Code :
|
Marsh Posté le 18-07-2006 à 13:22:28
c'est dans le mauvais sens, je t'avais dit d'inverser les clés dans ma fonction du dessus. J'avais mis en 1 niveau et en 2 lot_pere, toi tu veux le contraire:
Code :
|
Marsh Posté le 18-07-2006 à 14:08:38
Comment je te respectes mon ami
Merci à toi !!!
Pourrais tu m'expliquer en quelques lignes comment fonctionne ta fonction, le principe car le coup des return 0, 1 ou -1, je capte pas des masses.
Marsh Posté le 18-07-2006 à 14:20:55
Bon en fait, j'ai oublié une donnée importante (quel boulet).
Mon tableau devait ressembler plus à ceci :
Code :
|
Oui car derrière, je fais une arborescence type treeview.
Désolé, ça complique la chose :s
Marsh Posté le 18-07-2006 à 14:26:42
bin en fait je vois pas trop ou c'est pas clair
En gros tu compares 2 choses A et B selon deux critères, qui sont dans l'ordre d'importance lot_pere et niveau.
La fonction retourne -1 si A est plus petit que B, 0 si les deux sont égaux, 1 si A est plus grand que B.
Donc ça fait:
|
ça va comme ça?
edit:
Quand a ton dernier post, tu es en train de dire qu'il y a une troisième "critère" qui intervient?
Inspire toi de ce qui est au dessus, pour le rajouter. C'est pas très compliqué
Marsh Posté le 18-07-2006 à 15:31:41
Ouais mais je ne vois pas trop où mettre ma condition avec num_lot :s
Marsh Posté le 18-07-2006 à 15:58:08
Oui c'est ce que j'ai pensé tout de suite mais ça ne sert à rien, j'ai remarqué qu'avec le nouveau tableau, il passe pratiquement dans * SINON car c'est impossible qu'il y ai des doublons.
J'commence à m'épuiser mentalement lol.
Marsh Posté le 18-07-2006 à 16:01:39
bon montre la fonction que tu as écrite avec le dernier critère...
Marsh Posté le 18-07-2006 à 16:18:16
J'ai simplement fait ça pour l'instant :
Code :
|
Ca fonctionne quand j'ai deux niveaux mais à partir de 3, les autres niveaux sont tout le temps mis à lafin du tableau.
Là je met des echo un peu partout pour débugguer.
Marsh Posté le 18-07-2006 à 16:40:53
Sinon tu joues du Banjo le dimanche? Nan parce que le l'informatique ça me semble pas être ton truc ( sans méchanceté)
Alors deux solutions:
Sur l'exemple suivant tu chercherais donc à transformer:
|
en
|
auquel cas, tu dois vraiment t'en sortir tout seul ( tu as juste a copier un bout déjà fait, changer les clés et le colé à la place de la ligne marquée plus haut
Marsh Posté le 18-07-2006 à 10:45:06
uiop,
J'ai un tableau avec plusieurs entrées du genre :
Je n'ai mis que les trois premiers mais la liste est longue. Il n'est donc pas trié.
Je le remplie par niveau, je commence à chercher les informations de ma bdd pour le niveau 0, ensuite, je boucle sur ce niveau 0 pour voir s'il y a un sous niveau, le 1 et ainsi de suite. Donc le tableau a comme entrée au début, le niveau 0, ensuite le niveau 1, niveau 2, ...
Déjà, est-ce une bonne idée ou ne pourrait on pas le trier à la volée ?
Si non, comment pourrais je le trier par la suite ?
J'ai utilisé array_multisort() ou sort() mais sans résultat.
Si quelqu'un a une idée. Merci.
Message édité par NerOcrO le 18-07-2006 à 11:00:04