Page 1 sur 1

Trier les différentes dimensions d'un tableau

Posté : 12 juil. 2007, 19:25
par abelthorne
Bonjour,
J'ai un tableau multidimensionnel représentant les caractéristiques de divers produits et je voudrais classer chaque caractéristique selon l'ordre de l'une d'entre elles, en fonction des clés (qu'elles continuent à correspondrent entre elles).

Ce n'est pas très clair, j'en conviens. Exemple concret :
Mon tableau ressemble à ça :

Code : Tout sélectionner

Array ( [id] => Array ( [0] => 52 [1] => 8 [2] => 21 [3] => 11 ) [type] => Array ( [0] => autre [1] => livre [2] => autre [3] => livre ) [poids] => Array ( [0] => 0.435 [1] => 1.2 [2] => 0.5 [3] => 2.9 ) )
Je voudrais classer chaque objet selon son poids décroissant et obtenir le tableau suivant après le tri :

Code : Tout sélectionner

Array ( [id] => Array ( [0] => 11 [1] => 8 [2] => 21 [3] => 52 ) [type] => Array ( [0] => livre [1] => livre [2] => autre [3] => autre ) [poids] => Array ( [0] => 2.9 [1] => 1.2 [2] => 0.5 [3] => 0.435 ) )
Je n'arrive pas à grand chose avec les différentes fonctions de tri. Est-ce qu'un tel tri est possible via une fonction existante ou il faut la programmer ?

Posté : 13 juil. 2007, 09:33
par d0m
Je dirais que c'est possible en programmant toi même la fonction, ce qui peut être un peu lourd je pense.

Mais le problème est plutôt conceptuel.
Il serait plus naturel et pratique de construire ton tableau autrement avec un tableau contenant chaque élément sous forme d'un tableau contenant l'identifiant,le type,le poids,.... de l'élement.

Code : Tout sélectionner

Array ( [0] => Array ( [id] => 52 [type] => autre [poids] => 0.435 ) [1] => Array ( [id] => 8 [type] => livre [poids] => 1.2 ) ....... )
On a alors vraiment un tableau contenant chaque produit avec ses différentes caractéristiques et moins d'erreurs possibles. Tu peux même mettre l'id du produit en clé dans ton tableau pour faciliter ensuite la recherche d'un produit.
Pour le trier ensuite il suffit de faire une petite fonction de comparaison des poids:

Code : Tout sélectionner

function comparaison_poids($element1,$element2){ return ($element1['poids'] - $element2['poids']); }
et de faire le tri via une fonction php existante usort :

Code : Tout sélectionner

usort($tableau_elements,'comparaison_poids')
$tableau_elements étant le tableau des produits plus haut.

Pour trier suivant d'autres critère, il suffira d'ajouter des fonctions de comparaison (sur le type,...) et de les utiliser avec usort.

Posté : 13 juil. 2007, 09:44
par zeus
Il existe aussi la fonction php array_multisort()

Posté : 13 juil. 2007, 10:19
par abelthorne
Finalement, je me suis fait une fonction de tri. Pas très propre, mais qui a l'air de marcher.

J'ai hésité avant de créer la structure du tableau étant donné qu'à la base je ne manipulais que le poids et le type de chaque produit (c'est pour un calcul de frais de port en fonction du type).
Ça me paraissait plus clair pour m'y retrouver en créant mon tableau de test de la façon suivante :

Code : Tout sélectionner

$produit[type]=array('livre','autre','autre','livre','autre','livre'); $produit[poids]=array(0.435,0.05,0.02,0.5,1.2,2.8);
Après, je sais pas, j'hésite à organiser par produit plutôt que par caractéristique. Je n'ai pas vraiment l'habitude de manipuler des tableaux par clé mais plutôt par indice.

Merci pour les réponses, en tout cas.