php сортирует многомерный массив по значению с разными ключами - PullRequest
0 голосов
/ 16 октября 2019
Array
(
    [0] => Array
        (
            [id] => AL
            [country] => Albania
            [country_group] => 1
        )

    [1] => Array
        (
            [id] => AT
            [country] => Austria
            [country_group] => 1
        )

    [2] => Array
        (
            [id] => BE
            [country] => Belgium
            [country_group] => 1
        )

    [3] => Array
        (
            [id] => BG
            [country] => Bulgaria
            [country_group] => 1
        )

    [4] => Array
        (
            [id] => HR
            [country] => Croatia
            [country_group] => 1
        )

    [5] => Array
        (
            [id] => CY
            [country] => Cyprus
            [country_group] => 1
        )

    [6] => Array
        (
            [id] => CZ
            [country] => Czech Republic
            [country_group] => 1
        )

    [7] => Array
        (
            [id] => DK
            [country] => Denmark
            [country_group] => 1
        )

    [8] => Array
        (
            [id] => EG
            [country] => Egypt
            [country_group] => 1
        )

    [9] => Array
        (
            [id] => MF
            [country] => St. Martin
            [country_group] => 1
        )

    [10] => Array
        (
            [id] => 2
            [country_name] => Iceland
            [country_iso_code] => IS
            [country_id] => 98
        )
)

Теперь я хочу расположить массив в соответствии со значением ключевой страны в алфавитном порядке, чтобы Исландия должна была появиться после Египта, но у Исландии есть другой ключ для его имени country_name.

Я пробовал

usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

Он работает с тем же именем ключа, но если имя ключа отличается, он идет внизу.

Было бы намного больше стран, таких как Исландия, с ключом country_name. Мне нужна такая функция, как

arrange($array);

, и массив будет располагаться в алфавитном порядке в соответствии с ключами country и country_name.

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Итак, ваша логика

, если элемент имеет ключ country_name - используйте его для сортировки, иначе - используйте country ключ

usort($myArray, function($a, $b) {
    $aName = !empty($a['country_name']) ? $a['country_name'] : $a['country'];
    $bName = !empty($b['country_name']) ? $b['country_name'] : $b['country'];


    return strcmp($aName, $bName);
});

Другое решение состоит в том, чтобы перебрать $myArray, заменить ключ country_name на ключ country, где это необходимо, и отсортировать, как обычно.

0 голосов
/ 16 октября 2019

Usort - хороший выбор, но когда не хватает ключа country , просто используйте country_name .

usort($countries, function ($a, $b) {
    return ($a['country'] ?? $a['country_name']) > ($b['country'] ?? $b['country_name']);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...