Как отсортировать массив со специальными символами или числами в PHP? - PullRequest
1 голос
/ 09 января 2020

У меня возникли проблемы с сортировкой массива. Мой код работает с числами, но плохо работает со специальными символами. Я пытался также с функцией strcmp (), но не повезло. Вот мой код:

$sortBy = $this->input->get('sortBy') !== NULL ? $this->input->get('sortBy') : "";
$arr_ongoing = $this->getArr($this->array_ongoing, "id");
setlocale(LC_ALL, "fr-FR");
usort($arr_ongoing, function ($a, $b) use($sortBy) {
    return strcoll($a[$sortBy], $b[$sortBy]); 
});

вот мой пример массива: Array ( 1 => Array ([arrete_id] => 1 [etude_id] => 458 [фамилия] => Тест Шамбре [crpcen] => 29000 [ville] => Quimper)

[2] => Array
    (
        [arrete_id] => 2
        [etude_id] => 361
        [lastname] => PICART et Associé(s)
        [crpcen] => 44007
        [ville] => NANTES
    )

[3] => Array
    (
        [arrete_id] => 3
        [etude_id] => 35
        [lastname] => JARNOUEN de VILLARTAY et REGEON-VERGNOUX - SE
        [crpcen] => 22005
        [ville] => SAINT-BRIEUC CEDEX 2
    )

[12] => Array
    (
        [arrete_id] => 12
        [etude_id] => 132
        [lastname] =>  LE PAPE et LACOURT
        [crpcen] => 29022
        [ville] => PONT-L'ABBE CEDEX
    )

[13] => Array
    (
        [arrete_id] => 13
        [etude_id] => 222
        [lastname] => KERJEAN et Associé(s)
        [crpcen] => 35129
        [ville] =>  BRUZ CEDEX
    )

)

output

1 Ответ

1 голос
/ 09 января 2020

Если под «специальными символами» вы подразумеваете символы, указывающие c на конкретный язык, я предлагаю использовать Collator из пакета расширений intl.

Например, для Poli sh стандарт sort из:

$array = [ 'a', 'ą', 'b', 'z' ];

даст вам:

array(4) {
  [0] =>
  string(1) "a"
  [1] =>
  string(1) "b"
  [2] =>
  string(1) "z"
  [3] =>
  string(2) "ą"
}

при сортировке с использованием Collator правильный:

$collator = new Collator('pl_PL');
$collator->sort($array);

дает правильное значение:

array(4) {
  [0] =>
  string(1) "a"
  [1] =>
  string(2) "ą"
  [2] =>
  string(1) "b"
  [3] =>
  string(1) "z"
}

Если вы не можете использовать pecl intl, но, используя PHP> = 7.0.0, вы можете использовать эту библиотеку: https://github.com/voku/portable-utf8

например:

$array = [ 'a', 'ą', 'b', 'z' ];

function mysort($a, $b) {
    return UTF8::strcmp($a, $b);
}

use voku\helper\UTF8;
usort($array, 'mysort');


Не требует установки mbstring или intl (хотя и предлагает это).

Вы не должны полагаться на setlocale, поскольку оно основано на региональных настройках, установленных в конкретной системе, и они могут не только не устанавливаться, но и их имена могут различаться (между Windows и * nix, но также и между * nixes).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...