captain_torche Posté 28 Avril 2009 Partager 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 ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick Posté 28 Avril 2009 Partager 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jcaron Posté 29 Avril 2009 Partager 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
captain_torche Posté 29 Avril 2009 Auteur Partager Posté 29 Avril 2009 Merci, je testerai dans la journée Jcaron, à quoi sert l'opérateur que tu mentionnes ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
SStephane Posté 29 Avril 2009 Partager 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jcaron Posté 29 Avril 2009 Partager 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
captain_torche Posté 29 Avril 2009 Auteur Partager 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). Lien vers le commentaire Partager sur d’autres sites More sharing options...
jcaron Posté 29 Avril 2009 Partager 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Message populaire. captain_torche Posté 29 Avril 2009 Auteur Message populaire. Partager 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant