#php #multilingual #alphabetical #alphabetical-sort
#php #многоязычный #алфавитный #сортировка по алфавиту
Вопрос:
Традиционные алгоритмы сортировки по алфавиту, предлагаемые в StackOverflow для PHP, хорошо подходят для сортировки в английском алфавитном порядке, но с другими языками, которые имеют другой порядок алфавита или, возможно, даже другие знаки, обычные алгоритмы сортировки не работают. Например:
<?php
$palabras = ['áncora', 'avión', 'esperanza', 'élite', 'perro', 'niña', 'nina', 'ñaña'];
//Traditional sorting method
sort($palabras);
var_dump($palabras);
/*
returns an inadequate order:
array(8) {
[0]=>
string(6) "avión"
[1]=>
string(9) "esperanza"
[2]=>
string(4) "nina"
[3]=>
string(5) "niña"
[4]=>
string(5) "perro"
[5]=>
string(7) "áncora"
[6]=>
string(6) "élite"
[7]=>
string(6) "ñaña"
}
*/
Как отсортировать эти массивы простым способом?
Ответ №1:
Самый простой способ — использовать очень полезный класс Collator, который был разработан в PHP для этих явных целей. В нем уже запрограммированы адекватные алгоритмы сортировки для множества языков и алфавитов.
Это пример того, как его использовать:
<?php
$palabras = ['áncora', 'avión', 'esperanza', 'élite', 'perro', 'niña', 'nina', 'ñaña'];
//Make a Collator object with the locale code of the language to sort.
$collator = new Collator('es_ES');
//Use Collator::sort() instead of sort() [returns a numerical array];
//or Collator::asort() instead of asort [maintains the keys of an associative array].
$collator->sort($palabras, Collator::SORT_REGULAR);
var_dump($palabras);
/*
returns:
array(8) {
[4]=>
string(7) "áncora"
[3]=>
string(6) "avión"
[0]=>
string(6) "élite"
[7]=>
string(9) "esperanza"
[2]=>
string(4) "nina"
[1]=>
string(5) "niña"
[6]=>
string(6) "ñaña"
[5]=>
string(5) "perro"
}
*/
Вы можете ознакомиться с документацией здесь:
Класс: https://www.php.net/manual/en/class.collator.php
Функция сортировки: https://www.php.net/manual/en/collator.sort.php
Функция asort: https://www.php.net/manual/en/collator.asort.php