Недавно я узнал, что PHP уже поддерживает Алгоритм сортировки Unicode через расширение intl :
$array = array
(
'al', 'be',
'Alpha', 'Beta',
'Álpha', 'Àlpha', 'Älpha',
'かたかな',
'img10.png', 'img12.png',
'img1.png', 'img2.png',
);
if (extension_loaded('intl') === true)
{
collator_asort(collator_create('root'), $array);
}
Array
(
[0] => al
[2] => Alpha
[4] => Álpha
[5] => Àlpha
[6] => Älpha
[1] => be
[3] => Beta
[11] => img1.png
[9] => img10.png
[8] => img12.png
[10] => img2.png
[7] => かたかな
)
Как видите, это работает отлично, даже со строками со смешанным регистром! Единственный недостаток, с которым я столкнулся до сих пор, заключается в том, что нет поддержки для естественная сортировка , и мне интересно, как лучше всего обойти это, чтобы я мог объединить лучшее из двух миров.
Я попытался указать Collator :: Флаг сортировки SORT_NUMERIC
, но результат намного сложнее:
collator_asort(collator_create('root'), $array, Collator::SORT_NUMERIC);
Array
(
[8] => img12.png
[7] => かたかな
[9] => img10.png
[10] => img2.png
[11] => img1.png
[6] => Älpha
[5] => Àlpha
[1] => be
[2] => Alpha
[3] => Beta
[4] => Álpha
[0] => al
)
Однако, если я запускаю тот же тест только со значениями img * .png
, я получаю идеальный результат:
Array
(
[3] => img1.png
[2] => img2.png
[1] => img10.png
[0] => img12.png
)
Может ли кто-нибудь придумать способ сохранить сортировку в Юникоде при добавлении возможностей естественной сортировки?