Как использовать несколько флагов sort_flags при сортировке массива PHP (с помощью SORT_LOCALE_STRING, SORT_NATURAL)?
Я хочу использовать SORT_LOCALE_STRING для языков UTF8 + номера SORT_NATURAL.
Я хочу отсортироватьследующий массив:
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
Мой любимый результат после сортировки:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[3] => Älpha3
[4] => Älpha4
[5] => Älpha10
[6] => Bravo
)
Но при использовании SORT_LOCALE_STRING:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
setlocale(LC_COLLATE, 'de_DE.UTF8', 'de.UTF8', 'de_DE.UTF-8', 'de.UTF-8');
sort($array, SORT_LOCALE_STRING);
print_r($array);
?>
Результаты:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha10
[3] => Älpha2
[4] => Älpha3
[5] => Älpha4
[6] => Bravo
)
И при использовании SORT_NATURAL:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
sort($array, SORT_NATURAL);
print_r($array);
?>
Результаты:
Array
(
[0] => Alpha
[1] => Bravo
[2] => Älpha1
[3] => Älpha2
[4] => Älpha3
[5] => Älpha4
[6] => Älpha10
)
Как я могу получить такой результат?!
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[3] => Älpha3
[4] => Älpha4
[5] => Älpha10
[6] => Bravo
)
ОБНОВЛЕНИЕ:
Я наконец нашел решение, используя intl И Класс Collator .
Сначала,включить расширение PHP intl.
Тогда:
<?php
$array=array('Alpha', 'Älpha1', 'Älpha2', 'Älpha10', 'Älpha3', 'Älpha4', 'Bravo');
$collator = new Collator('de_DE.UTF8');
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST);
$collator->asort($array);
print_r($array);
?>
Результаты:
Array
(
[0] => Alpha
[1] => Älpha1
[2] => Älpha2
[4] => Älpha3
[5] => Älpha4
[3] => Älpha10
[6] => Bravo
)