Trier les différentes dimensions d'un tableau

Eléphant du PHP | 92 Messages

12 juil. 2007, 19:25

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 ?

d0m
Mammouth du PHP | 1141 Messages

13 juil. 2007, 09:33

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

13 juil. 2007, 09:44

Il existe aussi la fonction php array_multisort()
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 92 Messages

13 juil. 2007, 10:19

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.