Aller au contenu

Tri d'un tableau selon un critère différent de la clé


Sujets conseillés

Posté

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 ?

Posté

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

Posté (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é par jcaron
Posté

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 :)

Posté
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.

Posté

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).

Posté

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.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...