Aller au contenu

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


captain_torche

Sujets conseillés

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

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

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
Lien vers le commentaire
Partager sur d’autres sites

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

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

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

Veuillez vous connecter pour commenter

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



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