captain_torche Posté 28 Avril 2009 Posté 28 Avril 2009 J'ai un array de données, issu d'une fusion entre deux tableaux. il est formé de la sorte : [0] => array('produit' => 'produit1', 'prix' => 15);[1] => array('produit' => 'produit2', 'prix' => 10);[2] => array('produit' => 'produit3', 'prix' => 30);[...] J'aimerais le trier pour que les produits soient triés par prix croissant, mais ne trouve pas la fonction à utiliser. Une idée ?
Patrick Posté 28 Avril 2009 Posté 28 Avril 2009 Salut, sauf erreur il s'agit du principe du tri à bulles. Voici un code php pour un tableau à 1 dimension, tu devrais pourvoir adapter le code à ton cas function quicksort($seq){ if(!count($seq)) return $seq; $k = $seq[0]; $x = $y = array(); for($i=1; $i<count($seq); $i++) { if($seq[$i] <= $k) { $x[] = $seq[$i]; } else { $y[] = $seq[$i]; } } return array_merge(quicksort($x), array($k), quicksort($y));} Le code n'est pas de moi mais je n'arrive pas à remettre la main sur le site où je l'ai trouvé. Mais il fait parti des bouts de scripts de ma bibliothèque. ++ Patrick
jcaron Posté 29 Avril 2009 Posté 29 Avril 2009 (modifié) http://us2.php.net/manual/en/function.usort.php En gros: function cmp($a,$b){ if ($a['prix'] == $b['prix']) { return 0; } if ($a['prix'] < $b['prix']) { return -1; } return 1;}usort($tableau,"cmp"); Dommage qu'il n'y ait pas d'opérateur <=> en php comme en perl, ce serait nettement plus court. Jacques. EDIT: oublié le "u" de usort. Modifié 29 Avril 2009 par jcaron
captain_torche Posté 29 Avril 2009 Auteur Posté 29 Avril 2009 Merci, je testerai dans la journée Jcaron, à quoi sert l'opérateur que tu mentionnes ?
SStephane Posté 29 Avril 2009 Posté 29 Avril 2009 Pour info, la méthode de jacques est bien plus performante qu'un tri à bulles, qui est le "pire" des algos de tri de tableau
jcaron Posté 29 Avril 2009 Posté 29 Avril 2009 Jcaron, à quoi sert l'opérateur que tu mentionnes ? En perl, <=> est un opérateur binaire de comparaison numérique qui renvoie -1, 0 ou 1 suivant que la première valeur est plus petite, égale, ou plus grande que la deuxième. Tout juste ce qu'il faut pour usort, quoi. C'est le pendant numérique de cmp (strcmp en php ou en C) pour les chaînes de caractères. Ca veut dire qu'en perl, la même chose que si dessus s'écrit sort {$a->{prix} <=> $b->{prix}} _AT_tableau. Jacques.
captain_torche Posté 29 Avril 2009 Auteur Posté 29 Avril 2009 Effectivement, c'est plus court Merci pour la précision ! Je viens de tester ta fonction, elle marche à la perfection. C'est juste dommage qu'elle ne puisse pas être plus "générique" (Le paramètre prix est "en dur" dans la fonction).
jcaron Posté 29 Avril 2009 Posté 29 Avril 2009 function cmp_field($f,$a,$b){return $b[$f]-$a[$f]; // ah ben oui c'est plus court comme ça aussi :-)}function sort_array_field($array,$field){ usort($array,create_function("$a,$b","return cmp_field('"+$t+"',$a,$b)"));}sort_array_field($tableau,"prix"); Pas testé... Jacques.
Message populaire. captain_torche Posté 29 Avril 2009 Auteur Message populaire. Posté 29 Avril 2009 Après quelques menues corrections, ça marche, merci ! function cmp_field($field,$a,$ { return $a[$field]-$b[$field];}function sort_array_field(&$array, $field) { usort($array, create_function('$a,$b','return cmp_field("'.$field.'",$a,$;'));} 1
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant