Как отсортировать массив по алфавиту на разных языках (испанский, французский, русский и т.д.) в php?

#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