Cette question est destinée à servir de référence concernant les problèmes de tri des tableaux en PHP. Il est facile de penser que votre cas particulier est unique et mérite une nouvelle question, mais la plupart ne sont en réalité que des variations mineures de l'une des solutions proposées sur cette page.
Si votre question a été fermée en double de cette question, veuillez demander à rouvrir votre question uniquement si vous pouvez expliquer pourquoi elle est significativement différente de toutes les questions ci-dessous.
Comment trier un tableau en PHP ?
Comment trier un tableau complexeen PHP ?
Comment trier un tableau d’objets en PHP ?
Tableau unidimensionnel de base inclus ; Tableaux multidimensionnels, incl. Tableau d'objets ; comprend. Trier un tableau en fonction d'un autre tableau
Utilisez le tri SPL
Tri stable
Pour une réponse pratique utilisant les fonctions existantes de PHP, voir 1., et pour une réponse académiquement détaillée sur les algorithmes de tri (que les fonctions PHP implémentent et dont vous pourriez pourriez avoir besoin dans des cas très, très complexes), voir 2.
D'accord, decezea couvert la plupart des méthodes de base, je vais essayer d'examiner d'autres types de tri
Trier avec SPL
SplHeap
Sortie
SplMaxHeap
La classe SplMaxHeap fournit la fonctionnalité principale du tas, en gardant la valeur maximale en haut.
SplMinHeap
Autres types de tri
Tri à bulles
Extrait deArticle Wikipédia sur le tri à bulles :
Tableau unidimensionnel de base
Fonctions de tri applicables :
排序
排序
分类
排序
natsort
natcasesort
ksort
krsort
La seule différence entre eux est de savoir s'il faut conserver l'association clé-valeur ("
a
”函数),是否按从低到高排序或反向排序(“r
” >”),是否对值或键进行排序(“k
”)以及如何比较值(“nat
" vs. normal). Voir http://php.net/manual/en/array.sorting.php pour un aperçu et un lien vers plus de détails.Tableaux multidimensionnels, y compris les tableaux d'objets
Si vous souhaitez appuyer sur la paire de touches "foo" de chaque entrée
$array
进行排序,则需要一个自定义比较函数。上面的sort
et les fonctions associées fonctionnent sur des valeurs simples qu'elles savent comparer et trier. PHP ne "sait" pas simplement comment gérer les valeurs complexes comme array('foo' => 'bar', 'baz' => 42);Pour ce faire, vous devez créer une fonction de comparaison. Cette fonction accepte deux éléments et si les éléments sont considérés comme égaux, elle doit renvoyer
0
;如果第一个值较低,则必须返回低于0
的值;如果认为第一个值低于0,则必须返回高于
0 的值
si la première valeur est supérieure. C'est tout ce qu'il faut :En général, vous souhaiterez utiliser une fonction anonyme comme rappel. Si vous souhaitez utiliser des méthodes ou des méthodes statiques, consultez Autres façons de spécifier des rappels en PHP.
Ensuite, vous pouvez utiliser l'une des fonctions suivantes :
usort
uasort
uksort
Encore une fois, ils diffèrent uniquement selon que les associations clé-valeur sont préservées et si elles sont triées par valeur ou par clé. Veuillez lire leur documentation pour plus de détails.
Exemple d'utilisation :
usort
将从数组中取出两项并用它们调用您的cmp
函数。因此cmp()
将以$a
的形式调用array('foo' => 'bar', 'baz' => 42)
和$b
作为另一个array('foo' => ..., 'baz' => ...)
。然后该函数返回到usort
哪个值更大或者它们是否相等。usort
重复此过程,为$a
和$b
传递不同的值,直到数组排序完毕。cmp
函数将被调用多次,至少与$array
中的值一样多,并且值的不同组合每次代码>$a和$b
.Pour vous habituer à cette idée, essayez ce qui suit :
Tout ce que vous avez à faire est de définir une manière personnalisée de comparer deux éléments et c'est tout ce dont vous avez besoin. Cela fonctionne pour une variété de valeurs.
À propos, cela fonctionne avec toutes les valeurs, qui ne doivent pas nécessairement être des tableaux complexes. Vous pouvez également comparer de simples tableaux de nombres si vous souhaitez effectuer une comparaison personnalisée.
sort
Le tri par référence ne retournera rien d'utile !Notez que les tableaux sont triés sur place, vous n'avez pas besoin d'attribuer la valeur de retour à quoi que ce soit.
$array = sort($array)
会将数组替换为true
,而不是排序后的数组。只需sort($array);
C'est tout.Comparaison de numéros personnalisés
Si vous souhaitez trier par touches numériques
baz
, il vous suffit de :Grâce au pouvoir des math, cela renverra une valeur 0, en fonction de
$a
是否小于、等于或大于$b
.Notez que cela est vrai pour la valeur de retour
float
值不起作用,因为它们会被简化为int
并失去精度。请改用显式-1
、0
和1
.Objet
Si vous disposez d'un tableau d'objets, cela fonctionne de la même manière :
Fonction
Vous pouvez faire tout ce dont vous avez besoin dans la fonction de comparaison, y compris appeler des fonctions :
Chaîne
Raccourci pour la première version de comparaison de chaînes :
strcmp
完全符合cmp
的预期,它返回-1
、0
或1
.Opérateur de vaisseau spatial
PHP 7 introduit le opérateur de vaisseau spatial, qui unifie et simplifie les comparaisons égal/inférieur/supérieur à entre les types : p>
Trier par plusieurs champs
Si vous souhaitez trier principalement par
foo
, mais si lesfoo
de deux éléments sont égaux, alors triez parfoo
排序,但如果两个元素的foo
相等,则按baz
:Pour ceux qui sont familiers, cela équivaut à une requête SQL utilisant
ORDER BY foo, baz
.Voir aussi cette version abrégée très conciseet comment créer dynamiquement une telle fonction de comparaison pour n'importe quel nombre de clés.
Trier par ordre statique manuel
Si vous souhaitez trier les éléments dans un "ordre manuel" comme "foo", "bar", "baz" :
Pour tout ce qui précède, si vous utilisez PHP 5.3 ou supérieur (et vous devriez vraiment le faire), utilisez des fonctions anonymes pour raccourcir votre code et éviter une autre fonction globale :
C'est un moyen simple de trier des tableaux multidimensionnels complexes. Encore une fois, apprenez à PHP comment déterminer lequel des deux éléments est "le plus gros" laissez PHP faire le tri.
De plus, pour tout ce qui précède, pour basculer entre l'ordre croissant et décroissant, échangez simplement les paramètres
$a
和$b
. Par exemple :Trier un tableau en fonction d'un autre tableau
Il y en a aussi un plus sophistiqué
array_multisort
qui vous permet de trier un tableau en fonction de : Un autre :Le résultat attendu ici est :
Allez-y en utilisant
array_multisort
:À partir de PHP 5.5.0, vous pouvez utiliser
array_column
pour extraire une colonne d'un tableau multidimensionnel et trier le tableau sur cette colonne :Vous pouvez également trier plusieurs colonnes dans les deux sens :
À partir de PHP 7.0.0, vous pouvez également extraire les propriétés d'un tableau d'objets.