En PHP, le tri des réseaux est une opération courante dans le traitement des données, en particulier si l'on fait face à des tableaux ou des scénarios multidimensionnels où un tri multi-conditionnel est nécessaire, il est particulièrement important de choisir la fonction de tri appropriée. Arsort () et ksort () sont deux fonctions qui sont souvent utilisées en combinaison. Grâce à leur combinaison, les valeurs et les clés des tableaux peuvent être gérées de manière ordonnée. Cet article expliquera en détail comment ces deux fonctions sont utilisées en combinaison pour réaliser le tri multi-conditionnel en combinaison.
arsort () : trier le tableau dans l'ordre descendant, conserver les noms de clés et trier par "valeur".
KSORT () : Triez le tableau dans l'ordre croissant par "clé", en conservant la valeur de clé.
Bien que ces deux fonctions soient essentiellement des «valeurs» et des «clés» respectivement, dans certains scénarios, ils peuvent être utilisés ensemble pour obtenir une logique de tri multi-conditions plus flexible.
Supposons qu'il existe un tableau comme suit pour représenter les enregistrements de score de plusieurs utilisateurs:
<span><span><span class="hljs-variable">$users</span></span><span> = [
</span><span><span class="hljs-string">'user3'</span></span><span> => [</span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">85</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> => </span><span><span class="hljs-number">120</span></span><span>],
</span><span><span class="hljs-string">'user1'</span></span><span> => [</span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">92</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> => </span><span><span class="hljs-number">110</span></span><span>],
</span><span><span class="hljs-string">'user2'</span></span><span> => [</span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">85</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> => </span><span><span class="hljs-number">100</span></span><span>],
</span><span><span class="hljs-string">'user4'</span></span><span> => [</span><span><span class="hljs-string">'score'</span></span><span> => </span><span><span class="hljs-number">92</span></span><span>, </span><span><span class="hljs-string">'time'</span></span><span> => </span><span><span class="hljs-number">130</span></span><span>],
];
</span></span>
Les exigences actuelles sont:
Premier tri par score (score);
Si les scores sont les mêmes, triez-les par ordre croissant par temps d'achèvement (temps);
Si le score et l'heure sont les mêmes, triez-le en ordre croissant par nom d'utilisateur (nom de clé).
Pour obtenir un tri complexe, vous pouvez utiliser uasort () en combinaison avec des fonctions personnalisées:
<span><span><span class="hljs-title function_ invoke__">uasort</span></span><span>(</span><span><span class="hljs-variable">$users</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>] == </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>]) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span>[</span><span><span class="hljs-string">'time'</span></span><span>] == </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'time'</span></span><span>]) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// Partir pour une utilisation ultérieureksortTriage du nom de clé de la clé</span></span><span>
}
</span><span><span class="hljs-keyword">return</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span>[</span><span><span class="hljs-string">'time'</span></span><span>] < </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'time'</span></span><span>]) ? -</span><span><span class="hljs-number">1</span></span><span> : </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-comment">// Temps ascendant</span></span><span>
}
</span><span><span class="hljs-keyword">return</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>] > </span><span><span class="hljs-variable">$b</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>]) ? -</span><span><span class="hljs-number">1</span></span><span> : </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-comment">// Score descendant</span></span><span>
});
</span></span>
Étant donné que UaSort () n'affecte pas l'ordre des noms de clés, nous pouvons utiliser ksort () pour trier les noms de clés, mais cette étape n'a de sens que lorsque les valeurs sont les mêmes. Des structures de conversion intermédiaires peuvent être utilisées:
<span><span><span class="hljs-comment">// Reprètez les clés de tableau triées</span></span><span>
</span><span><span class="hljs-variable">$temp</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$users</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-variable">$groupKey</span></span><span> = </span><span><span class="hljs-variable">$value</span></span><span>[</span><span><span class="hljs-string">'score'</span></span><span>] . </span><span><span class="hljs-string">'-'</span></span><span> . </span><span><span class="hljs-variable">$value</span></span><span>[</span><span><span class="hljs-string">'time'</span></span><span>];
</span><span><span class="hljs-variable">$temp</span></span><span>[</span><span><span class="hljs-variable">$groupKey</span></span><span>][</span><span><span class="hljs-variable">$key</span></span><span>] = </span><span><span class="hljs-variable">$value</span></span><span>;
}
</span><span><span class="hljs-comment">// Trier chaque groupe de noms clés</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$temp</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> &</span><span><span class="hljs-variable">$group</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">ksort</span></span><span>(</span><span><span class="hljs-variable">$group</span></span><span>); </span><span><span class="hljs-comment">// Nom de clé ascendant</span></span><span>
}
</span><span><span class="hljs-comment">// Fusionner dans le résultat final</span></span><span>
</span><span><span class="hljs-variable">$final</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$temp</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$group</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$group</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$k</span></span><span> => </span><span><span class="hljs-variable">$v</span></span><span>) {
</span><span><span class="hljs-variable">$final</span></span><span>[</span><span><span class="hljs-variable">$k</span></span><span>] = </span><span><span class="hljs-variable">$v</span></span><span>;
}
}
</span></span>
Pour le moment, $ final est ce que nous attendons, trié par ordre décroissant de score, de l'ordre de temps ascendant et de l'ordre croissant des noms de clés.
Dans les projets réels, vous pouvez également aplatir les données, introduire des poids de tri et fonctionner en combinaison avec array_multisort () , mais cette méthode n'est pas très conviviale pour garder le nom de clé. En utilisant Arsort et Ksort en combinaison, vous pouvez préserver la structure complète et les noms clés du tableau associatif.
ARSORT () et KSORT () eux-mêmes ne peuvent pas prendre directement une prise en charge du tri multi-conditions, mais grâce à la logique de traitement et de tri en plusieurs étapes, combinée à des fonctions telles que Uasort () , les effets similaires à l'ordre par Col1 DESC et COL2 ASC dans SQL peuvent être implémentés de manière flexible. La maîtrise de ces techniques de tri aidera les développeurs à être plus à l'aise lorsqu'ils traitent des données complexes de tableau.