PHPでは、 NATSORT()関数を使用して、アレイを自然な順序でソートします。そのコア機能は、単に辞書のソートではなく、人間の認知習慣に従って文字列を並べ替えることです。 Natsort()は通常、英語の文字に最適ですが、コンテンツのソートが漢字である場合、予期しないソートの問題に遭遇する可能性があります。
この記事では、natsort()を使用して漢字をソートする際に遭遇する可能性のある問題を調査し、ソリューションを提供します。
漢字はアルファベット順にソートされました
ただし、漢字は英語の文字とは異なるエンコードされるため、 natsort()は辞書の順序で配列要素を並べ替えようとしますが、 natsort()は、実際の中国の順序で並べ替えるのではなく、中国語を処理するときにユニコードエンコード値の文字を比較します。したがって、「Zhang」と「Li」に似た漢字をソートすると、表示される場合があります。
中国のピンインの秩序は混乱しています
natsort()は、中国のピンイン秩序または他の言語ソートルールを自動的に考慮しません。これは、2つの漢字が明らかな順序を持っているように見える場合でも、 natsort()で完全に異なる動作をする可能性があることを意味します。たとえば、「Zhao」と「Money」は、前に「お金」、後ろに「Zhao」とソートされる場合があります。
漢字を正しく並べ替えるために、次の方法を使用して、 Natsort()または代替案を最適化できます。
CollatorはPHPが提供するクラスで、言語のソートに特異的に使用され、特定の領域(ロケール)に従って文字列をソートできます。中国の環境では、適切な領域を指定することにより、Pinyinによるソートの効果を得ることができます。これは、中国語のソートにコレートクラスを使用する例です。
<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">// 中国の環境を設定します</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">// 中国の配列があるとします</span></span><span>
</span><span><span class="hljs-variable">$names</span></span><span> = [</span><span><span class="hljs-string">"チャン・サン"</span></span><span>, </span><span><span class="hljs-string">"li si"</span></span><span>, </span><span><span class="hljs-string">"王ウー"</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">// 使用 Collator 選別</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>Collatorは、Unicode値だけでなく、Pinyin Orderに従ってソートすることができるため、中国の並べ替えルールに沿った結果を提供できます。
コラーが特定のニーズを満たすことができない場合、またはソートルールをカスタマイズする必要がある場合(特定のピニインやその他の注文に応じてソートなど)、カスタム比較関数を記述できます。 USORT()関数と組み合わせることで、中国のアレイを柔軟に並べ替えることができます。例えば:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 自定义選別函数,假设已知拼音或選別规则</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">// 根据拼音或其他规则进行選別</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">// 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">// 使用自定义選別函数</span></span><span>
</span><span><span class="hljs-variable">$names</span></span><span> = [</span><span><span class="hljs-string">"チャン・サン"</span></span><span>, </span><span><span class="hljs-string">"li si"</span></span><span>, </span><span><span class="hljs-string">"王ウー"</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>この例では、 getpinyin()は、漢字をピニインに変換するために使用される仮想関数です。このようにして、漢字はPinyinに従ってソートすることができます。
Natsort()では、デフォルトではPinyinの順序を考慮していませんが、場合によっては、最初に中国の弦をPinyin( Overtrue \ Pinyinなどのサードパーティライブラリを使用)に変換し、 Natsort()を使用してソートすることができます。このようにして、漢字をPinyin Orderで並べ替えることができます。
<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">// 中国の配列があるとします</span></span><span>
</span><span><span class="hljs-variable">$names</span></span><span> = [</span><span><span class="hljs-string">"チャン・サン"</span></span><span>, </span><span><span class="hljs-string">"li si"</span></span><span>, </span><span><span class="hljs-string">"王ウー"</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">// 中国人をピニインに変換します</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">// 使用 natsort 選別拼音</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">// 输出選別后的中文</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>ここでは、最初にOvertrue \ Pinyinを使用して漢字をPinyinに変換し、PinyinをNatsort()から並べ替えてから、Pinyinに従って元の漢字の順序を復元します。
Natsort()は、アレイを自然な順序でソートできる非常に強力な機能ですが、そのパフォーマンスは漢字を扱うときに私たちのニーズを満たすことができないことがよくあります。この問題を解決するには、次の選択肢を選択できます。
Collatorクラスを使用すると、中国のPinyinに従ってソートできます。
ソートロジックを完全に制御して、カスタムソート機能を作成します。
Natsort()とPinyin Conversion Libraryを組み合わせて、最初に中国人をPinyinに変換してから並べ替えます。
さまざまなソリューションがさまざまなニーズに適応し、開発者は漢字をソートするための実際の条件に応じて最も適切なソリューションを選択できます。