Tableaux unidimensionnels de base
$array = array(3, 5, 2, 8);
Fonctions de tri applicables:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
La différence entre celles-ci est simplement de savoir si les associations de valeurs-clés sont conservées (les a
fonctions " "), si elles trient de bas en haut ou inversement (" r
"), si elles trient des valeurs ou des clés (" k
") et comment elles comparent les valeurs. (" nat
" vs normal). Voir http://php.net/manual/en/array.sorting.php pour un aperçu et des liens vers plus de détails.
Tableaux multidimensionnels, y compris les tableaux d'objets
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
Si vous souhaitez trier $array
par la clé 'foo' de chaque entrée, vous avez besoin d'une fonction de comparaison personnalisée . Les fonctions ci sort
- dessus et connexes fonctionnent sur des valeurs simples qu'ils savent comparer et trier. PHP ne se contente pas de "savoir" quoi faire avec une valeur complexe comme array('foo' => 'bar', 'baz' => 42)
; vous devez donc le dire.
Pour ce faire, vous devez créer une fonction de comparaison . Cette fonction prend deux éléments et doit renvoyer 0
si ces éléments sont considérés comme égaux, une valeur inférieure à 0
si la première valeur est inférieure et une valeur supérieure à 0
si la première valeur est supérieure. C'est tout ce qu'il faut:
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
Souvent, vous souhaiterez utiliser une fonction anonyme comme rappel. Si vous souhaitez utiliser une méthode ou une méthode statique, consultez les autres façons de spécifier un rappel en PHP .
Vous utilisez ensuite l'une de ces fonctions:
Encore une fois, ils ne diffèrent que par le fait de conserver les associations clé-valeur et de les trier par valeurs ou clés. Lisez leur documentation pour plus de détails.
Exemple d'utilisation:
usort($array, 'cmp');
usort
prendra deux éléments du tableau et appellera votre cmp
fonction avec eux. Ainsi cmp()
sera appelé avec $a
comme array('foo' => 'bar', 'baz' => 42)
et $b
comme un autre array('foo' => ..., 'baz' => ...)
. La fonction retourne ensuite à usort
laquelle des valeurs était la plus grande ou si elles étaient égales. usort
répète ce processus en passant différentes valeurs pour $a
et $b
jusqu'à ce que le tableau soit trié. La cmp
fonction sera appelée plusieurs fois, au moins autant de fois qu'il y a de valeurs $array
, avec différentes combinaisons de valeurs pour $a
et à $b
chaque fois.
Pour vous habituer à cette idée, essayez ceci:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
Tout ce que vous avez fait était de définir une façon personnalisée de comparer deux articles, c'est tout ce dont vous avez besoin. Cela fonctionne avec toutes sortes de valeurs.
Soit dit en passant, cela fonctionne sur n'importe quelle valeur, les valeurs n'ont pas à être des tableaux complexes. Si vous souhaitez effectuer une comparaison personnalisée, vous pouvez également le faire sur un simple tableau de nombres.
sort
trie par référence et ne renvoie rien d'utile!
Notez que le tableau est trié sur place , vous n'avez pas besoin d'attribuer la valeur de retour à quoi que ce soit. $array = sort($array)
remplacera le tableau par true
, pas par un tableau trié. Fonctionne juste sort($array);
.
Comparaisons numériques personnalisées
Si vous souhaitez trier par la baz
clé, qui est numérique, il vous suffit de:
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
Grâce au PoWEr OF MATH, cela renvoie une valeur <0, 0 ou> 0 selon qu'elle $a
est inférieure, égale ou supérieure à $b
.
Notez que cela ne fonctionnera pas bien pour les float
valeurs, car elles seront réduites à un int
et perdront leur précision. Utilisez explicite -1
, 0
et les 1
valeurs de retour à la place.
Objets
Si vous avez un tableau d'objets, cela fonctionne de la même manière:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
Les fonctions
Vous pouvez faire tout ce dont vous avez besoin dans une fonction de comparaison, y compris les fonctions d'appel:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
Cordes
Un raccourci pour la première version de comparaison de chaînes:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
fait exactement ce qu'on attend d' cmp
ici, il revient -1
, 0
ou 1
.
Opérateur de vaisseau spatial
PHP 7 a introduit l' opérateur de vaisseau spatial , qui unifie et simplifie égal / plus petit / plus grand que les comparaisons entre les types:
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
Tri par plusieurs champs
Si vous souhaitez trier principalement par foo
, mais si foo
est égal pour deux éléments, trier par baz
:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
Pour ceux qui le connaissent, cela équivaut à une requête SQL avec ORDER BY foo, baz
.
Voir également cette version abrégée très soignée et comment créer dynamiquement une telle fonction de comparaison pour un nombre arbitraire de clés .
Tri dans un ordre manuel et statique
Si vous souhaitez trier les éléments dans un "ordre manuel" comme "foo", "bar", "baz" :
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
Pour tout ce qui précède, si vous utilisez PHP 5.3 ou supérieur (et vous devriez vraiment), utilisez des fonctions anonymes pour un code plus court et pour éviter d'avoir une autre fonction globale flottant:
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
Voilà comment le tri simple d'un tableau multidimensionnel complexe peut être. Encore une fois, pensez simplement en termes d' enseignement à PHP pour savoir lequel des deux éléments est "supérieur" ; laissez PHP faire le tri réel.
Aussi pour tout ce qui précède, pour basculer entre l'ordre croissant et décroissant, permutez simplement les arguments $a
et $b
. Par exemple:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
Tri d'un tableau en fonction d'un autre
Et puis il y a le particulier array_multisort
, qui vous permet de trier un tableau en fonction d'un autre:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
Le résultat attendu ici serait:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
Utilisez array_multisort
pour vous y rendre:
array_multisort($array1, $array2);
Depuis PHP 5.5.0, vous pouvez utiliser array_column
pour extraire une colonne d'un tableau multidimensionnel et trier le tableau sur cette colonne:
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
Depuis PHP 7.0.0, vous pouvez également extraire des propriétés d'un tableau d'objets.
Si vous avez des cas plus courants, n'hésitez pas à modifier cette réponse.