Dans PHP, la fonction Natsort () est utilisée pour trier les tableaux dans l'ordre naturel. Sa caractéristique centrale est de trier les chaînes en fonction des habitudes cognitives humaines, plutôt que simplement le tri du dictionnaire. Natsort () est généralement idéal pour les caractères anglais, mais lorsque le tri du contenu est des caractères chinois, nous pouvons rencontrer des problèmes de tri inattendus.
Cet article explorera les problèmes que vous pourriez rencontrer lors du tri des caractères chinois à l'aide de Natsort () et de fournir des solutions.
Les caractères chinois ont trié alphabétiquement
Natsort () tente de trier les éléments de tableau dans l'ordre du dictionnaire, car les caractères chinois sont codés différemment des lettres anglaises, Natsort () compare les caractères dans leurs valeurs encodées Unicode lors du traitement chinois, plutôt que de les trier dans l'ordre chinois réel. Par conséquent, lors du tri des caractères chinois, similaires à "Zhang" et "Li", peut apparaître.
L'ordre de pinyin chinois est déroutant
Natsort () ne considère pas automatiquement l'ordre de pinyin chinois ou d'autres règles de tri linguistique. Cela signifie que même si deux caractères chinois semblent avoir un ordre évident, ils peuvent se comporter complètement différemment dans Natsort () . Par exemple, "Zhao" et "Money" peuvent être réglés comme "Money" devant et "Zhao" à l'arrière.
Pour trier correctement les caractères chinois, nous pouvons utiliser les méthodes suivantes pour optimiser Natsort () ou des alternatives.
Collator est une classe fournie par PHP, qui est spécifiquement utilisée pour le tri linguistique, et peut trier les chaînes en fonction de régions spécifiques (paramètres régionaux). Dans un environnement chinois, vous pouvez obtenir l'effet du tri par Pinyin en spécifiant les zones appropriées. Voici un exemple d'utilisation de la classe Collator pour le tri chinois:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$locale</span></span><span> = </span><span><span class="hljs-string">'zh_CN'</span></span><span>; </span><span><span class="hljs-comment">// Configurer un environnement chinois</span></span><span>
</span><span><span class="hljs-variable">$collator</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Collator</span></span><span>(</span><span><span class="hljs-variable">$locale</span></span><span>);
</span><span><span class="hljs-comment">// Supposons qu'il y ait un tableau chinois</span></span><span>
</span><span><span class="hljs-variable">$names</span></span><span> = [</span><span><span class="hljs-string">"Zhang San"</span></span><span>, </span><span><span class="hljs-string">"Li si"</span></span><span>, </span><span><span class="hljs-string">"Wang wu"</span></span><span>, </span><span><span class="hljs-string">"Zhao Liu"</span></span><span>, </span><span><span class="hljs-string">"Qian Qi"</span></span><span>];
</span><span><span class="hljs-comment">// utiliser Collator Trier</span></span><span>
</span><span><span class="hljs-variable">$collator</span></span><span>-></span><span><span class="hljs-title function_ invoke__">asort</span></span><span>(</span><span><span class="hljs-variable">$names</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$names</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Le collator peut être trié en fonction de l'ordre de Pinyin, pas seulement des valeurs Unicode, donc il peut fournir des résultats plus conformes aux règles de tri chinois.
Si le collator ne peut pas répondre à un besoin spécifique, ou si vous devez personnaliser les règles de tri (telles que le tri selon un pinyin spécifique ou un autre ordre), vous pouvez écrire une fonction de comparaison personnalisée. Combiné avec la fonction USORT () , vous pouvez trier flexiblement les tableaux chinois. Par exemple:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 自定义Trier函数,假设已知拼音或Trier规则</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">customSort</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$a</span></span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
</span><span><span class="hljs-comment">// 根据拼音或其他规则进行Trier</span></span><span>
</span><span><span class="hljs-variable">$pinyin_a</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getPinyin</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>); </span><span><span class="hljs-comment">// Supposons qu'il existe une fonction qui se convertit en pinyin</span></span><span>
</span><span><span class="hljs-variable">$pinyin_b</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getPinyin</span></span><span>(</span><span><span class="hljs-variable">$b</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$pinyin_a</span></span><span>, </span><span><span class="hljs-variable">$pinyin_b</span></span><span>);
}
</span><span><span class="hljs-comment">// utiliser自定义Trier函数</span></span><span>
</span><span><span class="hljs-variable">$names</span></span><span> = [</span><span><span class="hljs-string">"Zhang San"</span></span><span>, </span><span><span class="hljs-string">"Li si"</span></span><span>, </span><span><span class="hljs-string">"Wang wu"</span></span><span>, </span><span><span class="hljs-string">"Zhao Liu"</span></span><span>, </span><span><span class="hljs-string">"Qian Qi"</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$names</span></span><span>, </span><span><span class="hljs-string">'customSort'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$names</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Dans cet exemple, getpinyin () est une fonction hypothétique utilisée pour convertir les caractères chinois en pinyin. De cette façon, les caractères chinois peuvent être triés selon Pinyin.
Bien que Natsort () ne considère pas l'ordre Pinyin par défaut, dans certains cas, vous pouvez d'abord convertir les cordes chinoises en pinyin (en utilisant des bibliothèques tierces telles que Overtrue \ Pinyin ), puis les trier via Natsort () . De cette façon, vous pouvez trier les caractères chinois dans l'ordre de Pinyin.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">require</span></span><span> </span><span><span class="hljs-string">'vendor/autoload.php'</span></span><span>;
</span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">Overtrue</span></span><span>\</span><span><span class="hljs-title">Pinyin</span></span><span>\</span><span><span class="hljs-title">Pinyin</span></span><span>;
</span><span><span class="hljs-variable">$pinyin</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Pinyin</span></span><span>();
</span><span><span class="hljs-comment">// Supposons qu'il y ait un tableau chinois</span></span><span>
</span><span><span class="hljs-variable">$names</span></span><span> = [</span><span><span class="hljs-string">"Zhang San"</span></span><span>, </span><span><span class="hljs-string">"Li si"</span></span><span>, </span><span><span class="hljs-string">"Wang wu"</span></span><span>, </span><span><span class="hljs-string">"Zhao Liu"</span></span><span>, </span><span><span class="hljs-string">"Qian Qi"</span></span><span>];
</span><span><span class="hljs-comment">// Convertir le chinois en pinyin</span></span><span>
</span><span><span class="hljs-variable">$names_pinyin</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$name</span></span><span>) </span><span><span class="hljs-keyword">use</span></span><span> ($</span><span><span class="hljs-title">pinyin</span></span><span>) {
</span><span><span class="hljs-title">return</span></span><span> $</span><span><span class="hljs-title">pinyin</span></span><span>-></span><span><span class="hljs-title">permalink</span></span><span>($</span><span><span class="hljs-title">name</span></span><span>);
}, </span><span><span class="hljs-variable">$names</span></span><span>);
</span><span><span class="hljs-comment">// utiliser natsort Trier拼音</span></span><span>
</span><span><span class="hljs-title function_ invoke__">natsort</span></span><span>(</span><span><span class="hljs-variable">$names_pinyin</span></span><span>);
</span><span><span class="hljs-comment">// 输出Trier后的中文</span></span><span>
</span><span><span class="hljs-variable">$sorted_names</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$names_pinyin</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">$sorted_names</span></span><span>[] = </span><span><span class="hljs-variable">$names</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>];
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$sorted_names</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Ici, nous utilisons d'abord Overtrue \ pinyin pour convertir les caractères chinois en pinyin, et trier le pinyin via Natsort () , puis restaurer l'ordre des caractères chinois d'origine selon le pinyin.
Bien que Natsort () soit une fonction très puissante qui peut trier les tableaux dans l'ordre naturel, ses performances ne répondent souvent pas à nos besoins lorsqu'ils traitent des caractères chinois. Pour résoudre ce problème, vous pouvez choisir:
En utilisant la classe de collator , il peut être trié selon le pinyin chinois.
Écrivez des fonctions de tri personnalisées avec un contrôle complet sur la logique de tri.
En combinant la bibliothèque de conversion Natsort () et Pinyin, convertissez le chinois en pinyin en premier et triez-le.
Différentes solutions s'adaptent à différents besoins, les développeurs peuvent choisir la solution la plus appropriée en fonction des conditions réelles pour trier les caractères chinois.