Comment puis-je trier des tableaux et des données en PHP?
Cette question se veut une référence pour les questions sur le tri des tableaux en PHP. Il est facile de penser que votre cas est unique et digne d'une nouvelle question, mais la plupart sont en fait des variations mineures de l'une des solutions sur cette page.
Si votre question est fermé comme un doublon de celui-ci, veuillez demander votre question sera ouvert uniquement si vous pouvez expliquer pourquoi il se distingue nettement de tous les ci-dessous.
Comment puis-je trier un tableau en PHP?
Comment puis-je trier un complexe tableau en PHP?
Comment puis-je trier un tableau d'objets en PHP?
Pour la réponse pratique à l'aide de PHP fonctions actuelles voir 1., pour l'universitaire en détail la réponse sur les algorithmes de tri (qui PHP les fonctions de mettre en œuvre et qui vous peut besoin pour vraiment, vraiment des cas complexes), voir les 2.
- Problème: 99% de l'unique flocon de neige questions (ha) sont un compromis avec absolument aucun pré-question de recherche 😐
- Exactement, c'est pourquoi j'ai fait cela pour avoir enfin une bonne question de référence pour fermer contre. Répondre à chaque flocon de neige individuellement n'aide pas n'importe qui. 🙂
- Je pense que les gens devraient simplement prendre un coup d'oeil à php.net
- Ha! Absolument. Problème: personne ne RTFM. 😀
- Nous avons les réponses déjà, je vous suggère de liste-lien de la meilleure des réponses à l'intérieur de chaque réponse ici, au lieu de dupliquer (ou la ré-écriture) le contenu. Aussi les tableaux ont tendance à être considéré individuellement, de sorte que le travail reste à proximité-vote contre les dupes, en tout cas.
- On pourrait mettre un lien dans la communauté balise wiki, car il y a des liens vers d'autres postes similaires de configuration par exemple: éviter les injection sql, exploitant les différences etc.
- Si personne ne RTFM, personne ne sera aussi RTFQA le Q&A 🙂
- Oui, tout cela a été déjà répondu dans un millier de cas distincts, ce qui est pourquoi il est pratiquement impossible de les trouver. Ainsi, cette. Si vous avez les bonnes réponses, par tous les moyens s'il vous plaît de les modifier dans la réponse.
- Ouais, mais à chaque fois je tombe sur une question que je le sais, a été répondu des milliers de fois, il est impossible de trouver une bonne référence pour fermer contre. Je ne m'attends pas les gens à trouver ce seul, je veux qu'il est aussi proche de référence.
- Je comprends ce que vous obtenez, mais l'erreur de référence est un peu différent, je pense. Tri vous avez vraiment besoin de comprendre une fois; je pense que fonctionne mieux avec une réponse cohérente expliquant différents angles. Faire pour séparer les réponses rendre chacun plus difficile à comprendre de l'OMI.
- Cela montre juste à quel beaucoup canonique de référence est nécessaire, si il y a déjà plusieurs couches de questions en pointant ici. Si vous avez une idée d'amélioration à partager, vous devriez le prendre sur Meta.DONC.
Vous devez vous connecter pour publier un commentaire.
De base dimensions des tableaux
Applicable fonctions de tri:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
La différence entre celles-ci est simplement de savoir si la clé-valeur associations sont conservés (le "
a
" fonctions), qu'il trie de faible à haute ou à l'inverse ("r
"), qu'il trie les valeurs ou les touches ("k
") et comment il se compare des valeurs ("nat
" par rapport à la normale). Voir http://php.net/manual/en/array.sorting.php pour une vue d'ensemble et des liens pour plus de détails.Multiples dimensions des tableaux, y compris les tableaux d'objets
Si vous souhaitez trier
$array
par la touche 'foo' de chaque entrée, vous avez besoin d'un personnalisé fonction de comparaison. Le ci-dessussort
et des fonctions liées à des travaux sur des valeurs simples qu'ils savent comment les comparer et les trier. PHP ne se contente pas de "savoir" que faire avec un valeur complexe commearray('foo' => 'bar', 'baz' => 42)
bien; si vous avez besoin de vous la raconter.Pour ce faire, vous devez créer un fonction de comparaison. Cette fonction prend deux éléments, et il doit retourner
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 la plus élevée. C'est tout ce qui est nécessaire:Souvent, vous souhaitez utiliser un fonction anonyme que la fonction de rappel. Si vous souhaitez utiliser une méthode ou une méthode statique, voir la d'autres façons de spécifier un rappel en PHP.
Vous utilisez l'une de ces fonctions:
usort
uasort
uksort
Encore une fois, ils ne diffèrent que si ils gardent la clé-valeur d'associations et de tri par des valeurs ou des clés. Lire leur documentation pour plus de détails.
Exemple d'utilisation:
usort
prendra deux éléments de la matrice et appelez votrecmp
fonctionner avec eux. Donccmp()
sera appelée avec$a
commearray('foo' => 'bar', 'baz' => 42)
et$b
comme un autrearray('foo' => ..., 'baz' => ...)
. La fonction retourne alors àusort
qui des valeurs plus grandes, ou si elles étaient égales.usort
répète ce processus de passage des valeurs différentes pour$a
et$b
jusqu'à ce que le tableau est trié. Lecmp
fonction sera appelée à de nombreuses reprises, au moins autant de fois qu'il y a des valeurs dans$array
, avec différentes combinaisons de valeurs pour$a
et$b
à chaque fois.À s'habituer à cette idée, essayez ceci:
Vous n'avez fait que définir de manière personnalisée afin de comparer deux éléments, c'est tout ce dont vous avez besoin. Qui fonctionne avec toutes sortes de valeurs.
Par la voie, cela fonctionne sur n'importe quelle valeur, les valeurs n'ont pas à être complexe des tableaux. Si vous avez une comparaison personnalisée que vous voulez faire, vous pouvez le faire sur un simple tableau de nombres trop.
sort
sortes par référence et ne retourne rien utile!Notez que le tableau sortes en place, vous ne devez pas affecter la valeur de retour pour rien.
$array = sort($array)
remplacera le tableau avectrue
, non pas avec un tableau trié. Justesort($array);
œuvres.Numérique personnalisé comparaisons
Si vous souhaitez trier par le
baz
clé, qui est numérique, tout ce que vous devez faire est de:Grâce à La Puissance de MATHÉMATIQUES elle retourne une valeur < 0, 0 ou > 0 selon que l'
$a
est inférieur, égal ou plus grand que$b
.Notez que cela ne fonctionne pas bien pour
float
valeurs, car ils vont être réduits à unint
et perdre de la précision. L'utilisation explicite-1
,0
et1
les valeurs de retour de la place.Objets
Si vous avez un tableau d'objets, il fonctionne de la même manière:
Fonctions
Vous pouvez faire ce que vous avez besoin à l'intérieur d'une fonction de comparaison, y compris les fonctions d'appel:
Chaînes
Un raccourci pour la première chaîne de la comparaison de version:
strcmp
fait exactement ce qu'on attend decmp
ici, il renvoie-1
,0
ou1
.Vaisseau spatial opérateur
PHP 7 a introduit le le vaisseau spatial de l'opérateur, qui unifie et simplifie l'égalité/petit/plus grand que les comparaisons entre types:
Tri par plusieurs champs
Si vous souhaitez trier principalement par
foo
, mais sifoo
est égal pour les deux éléments de trier parbaz
:Pour ceux qui connaissent, c'est l'équivalent d'une requête SQL avec
ORDER BY foo, baz
.Voir aussi cette très soigné version courte et comment créer une fonction de comparaison de façon dynamique pour un nombre arbitraire de clés.
Tri manuel, ordre statique
Si vous voulez trier les éléments dans un "manuel de la commande", comme "foo", "bar", "baz":
Pour tous les ci-dessus, si vous utilisez PHP 5.3 ou supérieur (et vous devriez vraiment), l'utilisation d'une fonction anonyme pour de courtes code et pour éviter d'avoir une autre fonction globale flottant autour de:
C'est la façon simple de tri d'un complexe multi-dimensionnel de la matrice. De nouveau, il suffit de penser en termes de enseignement PHP comment savoir lequel des deux éléments est la "grande"; laissez PHP faire le tri.
Aussi pour l'ensemble de la ci-dessus, pour basculer entre l'ordre croissant et l'ordre décroissant simplement échanger l'
$a
et$b
arguments autour de. E. g.:De tri d'un tableau en fonction d'une autre
Et puis il y a le singulier
array_multisort
, qui permet de trier un tableau en fonction d'une autre:Le résultat attendu serait ici:
Utilisation
array_multisort
pour y arriver:Depuis PHP 5.5.0, vous pouvez utiliser
array_column
pour extraire une colonne d'un tableau multi dimensionnel et trier le tableau sur cette colonne:PHP 7.0.0 vous pouvez aussi extraire les propriétés à partir d'un tableau d'objets.
array_flip()
de faire usage de la plus rapide de la position de recherche, par exemple$order[$a['foo']]
au lieu dearray_search($a['foo'], $order)
.Bien la plupart des méthodes de base sont déjà couverts par deceze je voudrais essayer de regarder d'autres types de trier
Tri avec SPL
SplHeap
Sortie
SplMaxHeap
La SplMaxHeap la classe fournit les fonctionnalités principales d'un segment, en gardant le maximum sur le dessus.
SplMinHeap
D'autres Types de Trier
De Tri À Bulles
De la Article de wikipédia sur le Tri à Bulles:
Tri de sélection
De l'article Wikipedia sur le tri de la Sélection:
Le tri par Insertion
De la Article de wikipédia sur le tri par Insertion:
Shellsort
De la Article de wikipédia sur Shellsort:
Peigne de sorte
De l'article de Wikipedia sur le Peigne de la sorte:
De fusion tri
De l'article de Wikipedia sur la Fusion de tri:
Quicksort
De l'article de Wikipedia sur Quicksort:
Permutation de tri
De l'article de Wikipedia sur la Permutation de tri:
Tri Radix
De l'article de Wikipedia sur la Base de tri:
O(n^2)
comparaisons si nous allons utiliser la première fois que l'élément de pivot)Tri Stable
Disons que vous avez un tableau comme ceci:
Et maintenant vous avez envie d'effectuer un tri sur la première lettre:
Le résultat est: est-ce
Le tri n'était pas stable!
L'observateur attentif peut-être remarqué que le tableau algorithme de tri (QuickSort) ne produisent pas un résultat stable et que la commande initiale entre les mots de la même première lettre n'était pas conservé. Ce cas est trivial, et nous devrions, par rapport à l'ensemble de la chaîne, mais supposons que votre cas d'utilisation est plus compliquée, comme les deux années consécutives sortes sur les différents champs qui ne doivent pas s'annuler les uns les autres.
La Schwartzian transformer
Le Schwartzian transformer, appelé aussi le décorer-tri-undecorate idiome, les effets d'un tri stable avec une intrinsèquement instable algorithme de tri.
Tout d'abord, vous décorez chaque élément du tableau à un autre tableau comprenant une clé primaire (de la valeur) et une clé secondaire (son index ou la position):
Cela transforme le tableau en ceci:
Maintenant, nous allons régler la comparaison de l'étape; nous comparons la première lettre de nouveau, mais si elles sont de la même, la clé secondaire est utilisé pour conserver l'original de la commande:
Par la suite, nous undecorate:
Le résultat final:
Que sur la réutilisation?
Vous avez eu à réécrire votre fonction de comparaison de travailler avec la transformation des éléments d'un tableau; vous ne pouvez pas souhaitez modifier votre délicates fonctions de comparaison, voici donc un wrapper pour la fonction de comparaison:
Écrivons l'étape de tri à l'aide de cette fonction:
Le tour est joué! Votre vierge de comparaison de code est de retour.
De PHP 5.3 avec des fermetures, il est également possible d'utiliser une fermeture à déterminer l'ordre de tri.
Par exemple en supposant que $array est un tableau d'objets qui contiennent une propriété mois.
LINQ
Dans .NET, LINQ est fréquemment utilisé pour le tri, qui fournit beaucoup plus agréable la syntaxe sur la comparaison des fonctions, en particulier lorsque les objets doivent être triés en fonction de plusieurs champs. Il y en a plusieurs ports de LINQ to PHP, y compris YaLinqo bibliothèque*. Avec elle, les tableaux peuvent être triés avec une seule ligne sans l'écriture complexe des fonctions de comparaison.
Comparaisons peut être personnalisé davantage par le passage d'un rappel comme deuxième argument, par exemple:
Ici,
'$v->count'
est un raccourci pourfunction ($v) { return $v->count; }
(peuvent être utilisés). La méthode des chaînes retour des itérateurs, les itérateurs peuvent être transformés en tableaux par l'ajout de->toArray()
en fin de compte, si nécessaire.En interne,
orderBy
et les méthodes connexes appel appropriée de la matrice de fonctions de tri (uasort
,krsort
,multisort
,usort
etc.).LINQ contient beaucoup plus de méthodes inspirées par SQL: le filtrage, le regroupement, l'assemblage, l'agrégation, etc. Il est le mieux adapté pour les cas de transformations complexes sur les tableaux et les objets doivent être exécutées sans s'appuyant sur des bases de données.
* développé par moi, voir le fichier readme pour plus de détails et de comparaison avec d'autres LINQ ports
Multidimensionnelle trier par valeur de la clé de
Naturel de tri d'un tableau multidimensionnel par une valeur de clé et aussi de conserver l'original de l'ordre(ne pas mélanger les touches principales):
Cas de Test:
Il est très pratique pour trier des tableaux avec triés fonction de Nspl:
De base de tri
Le tri sur le résultat de la fonction
De tri de tableau multidimensionnel
De tri de tableau d'objets
Tri avec une fonction de comparaison
Vous pouvez voir tous ces exemples ici.
Si vous souhaitez commander par la valeur de la clé, alors vous pouvez le faire en une ligne, élégante et claire. Ce sera de l'ordre de prix croissant. Utilise array_multisort et array_column.
pour produire
Il y a plusieurs façons de trier un tableau.Je me limiterai à quelques méthodes pour faire cette tâche.tout d'abord , je vais donner un tableau d'entiers qui est appelé comme '$nombre'.
C'est la voie normale de la création d'un tableau. Supposons que , je veux trier ce tableau dans l'ordre croissant.Pour cela, " trier()' méthode peut être utilisée.
Considérons maintenant la sortie de l',
Vous pouvez voir le numéro imprimé tableau est trié. Si vous voulez que le numéro tableau de tri est décroissant vue, rsort()' méthode peut être utiliser pour cette tâche.
envisager la sortie..
Maintenant le tableau est trié dans l'ordre décroissant.Ok, prenons l'exemple d'un tableau associatif.Je vais donner un tableau associatif(tableau Associatif signifie que, d'Un tableau dont chaque indice a valeur de clé unique.) comme ça,
Donc ,Maintenant, je veux trier ce tableau dans l'ordre croissant selon leur valeur.'asort () la méthode peut être utilisée pour cela.
Si le tri par ordre décroissant selon leur valeur, arsort()' méthode peut être utilisée.
Supposons que vous voulez trier ce tableau selon leur valeur de clé. Dans ce, ksort () la méthode peut être utilisée.
Considérons maintenant la sortie.
Maintenant le tableau est trié en fonction de leur valeur de clé.Si Vous souhaitez trier le tableau dans l'ordre décroissant en fonction de leur valeur de clé,'krsort()' méthode peut être utilisée.
Désormais tableau associatif est triée dans l'ordre décroissant en fonction de leur valeur de clé.Chercher à la sortie.
Sont quelques-uns des méthodes pour trier un tableau par ordre croissant ou décroissant en php.J'espère pour vous faire une idée.Merci!!!!
Le plus simple est d'utiliser la fonction usort de tri un tableau sans boucle :
Ci-dessous est un exemple :
Cela permettra de trier dans desending ordre :
Cela permettra de trier dans asending ordre :