1

Bon alors j'ai parcouru la doc php et j'ai trouvé la fonction array_multisort() pour trier des tableaux multi dimensionnels. Cependant sur mon tableau ça ne marche pas, ça me renvoit des warning et me bousille l'affichage.

Voici la structure de mon tableau:

$tab = array ( [variable1] => array ([variable2] => variable3) )

J'aimerai trier mon tableau par variable3 mais je n'ai pas reussis jusqu'à lors sad

Je suis deja une brelle en tableaux simple alors en multidimension je vous raconte pas...
avatar
"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches Meilleur smiley = #helico# Obligatory XKCD

2

regarde uasort

3

meme remarque : rien de tel que de passer par une fonction de tri en callback pour faire ce qu'on veut :

si t'es dans un objet :

uasort($lst, array(&$this, 'ma_methode_de_tri'));

avec

function ma_methode_de_tri($a, $b)
{
if ($a['a]['b']<$b['a]['b']) return -1;
if ($a['a]['b']>$b['a]['b']) return 1;
return 0;
}

(de mémoire, vérifie sur php.net)
Ancien pseudo : lolo

4

Hum ya du mieux je n'ai plus de waring cepandant je n'arrive pas à comprendre comment se passe l'appel de la fonction et de ce fait je ne peux pas arriver à trouver d'où vient mon problème! sad Désolé je suis un noob en php...

Je vous poste le petit bout de code avec qui je fais mon tableau:

                 foreach ($result -> listeDesComposantsNonCompositesDuProduit() as $ligne)
			{
				$tab[$ligne['nom_inci']][$ligne['cas']]=$ligne['pourcentage'];
			}

			foreach ($result -> listeDesSubstancesDuProduit() as $inci => $tableau)
			{
				foreach ($tableau as $cas => $pourcentage)
				{
					$tab[$inci][$cas]=$pourcentage;
				}
			}


Je fais pas du tout ça dans de l'objet, et voici comment je me sert de uasort():

uasort($tab, array(&$this, 'ma_methode_de_tri'));

J'ai bien sûr déclaré et rendu accessible la fonction de tri.

Si vous pouviez m'expliquer le principe pour m'aider à comprendre je vous serait reconnaissant. smile

Merci en tout cas de m'avoir répondu!
avatar
"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches Meilleur smiley = #helico# Obligatory XKCD

5

JoNas (./4) :
Je fais pas du tout ça dans de l'objet, et voici comment je me sert de uasort():

uasort($tab, array(&$this, 'ma_methode_de_tri'));

si tu ne fais pas d'objet, pourquoi tu utilises la méthode de spipu qui ne marche justement que dans le cas d'un objet ? ton "this" n'a aucun sens là, il faut juste préciser la fonction de tri à appeler, va lire la doc de php.net pour avoir des exemples d'utilisation de la fonction uasort.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

Je l'ai lu et surtout les commentaires des utilisateurs, mon problème c'est que je n'arrive pas à passer en paramètre la deuxième case de mon tableau vu que celle ci n'a pas une valeur fixe.

En gros mon tableau il ressemble à ça une fois affiché

voiture -> (ford mustang -> 4 roues)
velo -> (hoffman bike -> 2 roues)

etc...

moi je voudrait trier "par ordre de roues" et c'est là que ça coince :/
avatar
"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches Meilleur smiley = #helico# Obligatory XKCD

7

Je n'arrive pas comprendre ni la première phrase ton post ("passer en paramètre la deuxième case" ?, "valeur fixe" ?) ni la structure de ton tableau.

La fonction uasort utilise une fonction que tu as définie toi-même pour effectuer le tri : uasort va appeler cette fonction en lui passant chaque fois deux éléments de ton tableau, et c'est le résultat de cette fonction (-1 ou 1) qui détermine si les éléments sont dans le bon ordre ou mal triés. À partir de là c'est à toi d'écrire cette fonction pour lui faire retourner un résultat qui dépend de la 2eme case de ton tableau.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

En fait t'as compris mais c'est que j'ai jamais utilisé d'appel de fonction de cette manière et donc quand j'ai une fonction avec cett signature:

function my_sort($a, $b)

et que je l'appelle en faisant

uasort($tab, "my_sort");

je ne vois pas à quoi correspondent le $a et le $b.

Mon niveau PHP est très scolaire, on m'a toujours habitué a appeller les fonctions normalement, donc cet appel me déroute quelque peu et je n'arrive pas à trouver d'explications sur la corrspondance des variables lors d'in tel appel.

Encore merci de vous déranger pour me filer un coup de main c'est très sympa smile
avatar
"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches Meilleur smiley = #helico# Obligatory XKCD

9

$a et $b sont deux éléments de ton tableau. Ta fonction my_sort doit "dire" à uasort si ces éléments sont dans l'ordre ou pas (uasort n'en sait rien, ce n'est qu'une fonction de tri générique mais elle est incapable de comparer elle-même deux éléments dont elle ignore la structure). Si tu voulais faire par exemple une fonction qui trie un tableau de chaines par longueur, elle pourrait ressembler à ça :

function my_sort ($a, $b)
{
    return strlen ($a) < strlen ($b) ? -1 : 1;
}


Dans le cas où c'est la chaine $a qui est la plus courte, la fonction retourne -1, et uasort va considérer que les deux éléments $a et $b étaient bien triés. Par contre si la fonction retourne 1, alors uasort va inverser l'ordre de ces éléments dans ton tableau puisqu'ils n'étaient pas triés. my_sort peut effectuer n'importe quel traitement plus complexe sur $a et $b (qui peuvent être de n'importe quel types), elle ne sert qu'à indiquer si il faut les considérer comme dans l'ordre ($a < $b) ou pas ($a > $b).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

10

Zephyr (./7) :
et c'est le résultat de cette fonction (-1 ou 1)


-1, 1, ou 0 wink

$a et $b représentes 2 élements à comparer. La fonction que tu indique en paramètre est une fonction de comparaison, pas de tri. tu dois y comparer tes 2 elements en retournant -1 si $a < $b, +1 si $a > $b, et 0 si ils sont égaux.

voici une fonction de comparaison simple pour des nombres :

function my_sort($a, $b)
{
if ($a<$b) return -1;
if ($a>$b) return 1;
return 0;
}

apres, dans ton cas, il faut récuperer les premiers elements de $a et $b, donc :


function my_sort($a, $b)
{
$a = array_values($a) $a = isset($a[0]) ? $a[0] : array(); // récupère le premier sous tableau de $a
$b = array_values($b) $b = isset($b[0]) ? $b[0] : array(); // récupère le premier sous tableau de $b

$a = array_values($a) $a = isset($a[0]) ? $a[0] : null; // récupère la premier valeur du premier sous tableau de $a
$b = array_values($b) $b = isset($b[0]) ? $b[0] : null; // récupère la premier valeur du premier sous tableau de $b

if ($a<$b) return -1;
if ($a>$b) return 1;
return 0;
}


(a tester, j'ai peut-etre fait des erreurs)

[edit] cross avec zeph smile
Ancien pseudo : lolo

11

Spipu (./10) :
-1, 1, ou 0 wink

non, retourner 0 n'a aucun effet supplémentaire, il n'y a besoin que de -1 (trié) ou 1 (non trié), cf la doc des fonctions u*sort
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

12

http://fr3.php.net/manual/fr/function.usort.php
La fonction de comparaison cmp_function doit retourner un entier, qui sera inférieur, égal ou supérieur à zéro suivant que le premier argument est considéré comme plus petit, égal ou plus grand que le second argument. Si les deux arguments sont égaux, leur ordre est indéfini.


Ancien pseudo : lolo

13

Bah oui c'est bien ce que je dis, retourner 0 n'apporte rien de plus, une fonction qui retourne seulement -1 ou 1 peut avoir exactement le même résultat ^^ (cf quasiment tous les exemples de la fonction uasort sur la page dont tu as posté le lien, si tu veux une illustration)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

14

vi, sauf que si 2 éléments sont identiques, il va quand meme les trier alors qu'il ne devrait pas. C'est sur que le 0 est pas indispensable, mais c'est plus propre

l'exemple classique est si tu veux trier sur 1 colonne, puis que tu veux modifier pour faire sur 2 en meme temps, si dès le début tu as prévu le cas 0, c'est plus simple d'adapter smile

function trier($a, $b)
{
if ($a['nom']<$b['nom']) return -1;
if ($a['nom']>$b['nom']) return 1;

if ($a['prenom']<$b['prenom']) return -1;
if ($a['prenom']>$b['prenom']) return 1;

return 0;
}
Ancien pseudo : lolo

15

Spipu (./14) :
vi, sauf que si 2 éléments sont identiques, il va quand meme les trier

Bah non, il n'y a que deux actions possibles sur deux éléments : soit les inverser dans le tableau (= ils n'étaient pas triés), soit ne rien faire. Si ils sont identiques, on est dans le deuxième cas et il ne se passe rien.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

16

c sur, j'l'avais pas vu comme ca happy
Ancien pseudo : lolo

17

En fait j'ai très bien compris la séparation des focntions, uasort trient seulement en fonction du résultat renvoyé et la fonction maison se chargeant de renvoyer le résultat en fonction de ce qu'elle a pu comparer.

Là où je ne comprend pas c'est les 2 paramètres $a et $b.

Quand je fais

uasort($mon_tableau_a_trier ,"my_sort");

que représente $a et que représente $b?

C'est simplement sur ça que je bloque, sinon pour le principe je l'ai compris, vous m'avez très bien expliqué smile
avatar
"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches Meilleur smiley = #helico# Obligatory XKCD

18

Déjà répondu :
Zephyr (./9) :
$a et $b sont deux éléments de ton tableau

La fonction uasort va appeler my_sort en lui passant en paramètre des éléments de ton tableau, pour les comparer.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

19

Ha ok! Mon neuronne viens de s'allummer! Ptain j'étais en mode boulet, la fonction uasort prend un tableau et le parcoure un extrayant 2 cases cote a cote et en les envoyant à la fonction de tri, jusqua ce que le tableau soit trié, c'est bien ça?
avatar
"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches Meilleur smiley = #helico# Obligatory XKCD

20

en gros oui, c'est comme ça que ça fonctionne (modulo le fonctionnement exact de l'algo de tri utilisé par PHP, je ne sais pas sur lequel il se base)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

21

Bon @Zephyr et Spipu je vous voue un culte pour la journée!

J'ai compris le principe grâce à vous deux et j'ai pu ainsi adapter la fonction de spipu à mon cas, c'est parfait et ça respecte l'adage "Donne un poisson à un homme et il mangera pour une journée. Apprend-lui à pêcher et il mangera pour toute sa vie."


Merci beaucoup! Vraiment! smile
avatar
"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches Meilleur smiley = #helico# Obligatory XKCD

22

ah tiens, je n'avais pas lu la fonction proposée par spipu (post ./10) mais je me permets de proposer une variante un petit peu plus rapide :

function my_sort($a, $b)
{
    return array_shift (array_shift ($a)) < array_shift (array_shift ($b)) ? -1 : 1;
}

cette version tire parti du fait que :

- la fonction array_shift est plus rapide qu'un appel à array_value + récupération du 1er élément
- elle retourne "null" si le tableau passé en argument était vide
- elle retourne "null" si l'argument n'était pas un tableau

[edit] array_shift ne fonctionne peut-être que sur une variable et non sur une valeur (je n'ai pas vérifié), si c'est le cas il faudra procéder en deux étapes au lieu d'imbriquer les appels à array_shift l'un dans l'autre.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

23

Même si la rapidité n'est pas importante dans mon cas (mon tableau ne dépassant jamais 10 éléments) je la prend tout de même.

Merci encore! smile
avatar
"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches Meilleur smiley = #helico# Obligatory XKCD

24

arh, array_shift, j'essayais de m'en reppaler tout à' l'heure mais j'arrivais pas, d'ou mon truc hyper compliqué pour rien
Ancien pseudo : lolo