Сортировать многомерный массив с помощью ключа Dynami c для значения потомка - PHP - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть 4-мерный ассоциативный массив со всеми его ключевыми динамиками c. Я хочу отсортировать массив по значению его последнего потомка. Для справки, это массив:

$array = array(
    "Africa" => array(
        "Egypt" => array(
            "20" => array(
                "basicInfo" => array('population' => 'xxx', 'size' => 'xxx')
            )
        ),
        "Sudan" => array(
            "249" => array(
                "basicInfo" => array('population' => 'xxx', 'size' => 'xxx')
            )
        ),
        ...
        ...
    ),
    "Europe" => array(
        "Greece" => array(
            "30" => array(
                "basicInfo" => array('population' => 'xxx', 'size' => 'xxx')
            )
        ),
        "Netherlands" => array(
            "31" => array(
                "basicInfo" => array('population' => 'xxx', 'size' => 'xxx')
            )
        ),
        ...
        ...
    ),
    ...
    ...
);

В приведенном выше массиве я хочу отсортировать по численности населения в порядке убывания. До сих пор я пробовал uasort, array_multisort, но я думаю, что я делаю это неправильно. Может кто-нибудь помочь мне разобраться в этом?

uasort($records[$continent][$country][$countryCode]['basicInfo'], array($this, 'sortByPopulation' ));

Чтобы было ясно, я сортирую его в for l oop, пока он создается. Поскольку все переменные внутри массива являются динамическими c, я думаю, что их невозможно отсортировать после генерации массива.

Окончательный результат должен быть в том же формате, что и выше, континенты> страны> коды> basicInfo.

Спасибо

1 Ответ

2 голосов
/ 16 февраля 2020

Если вы хотите сортировать по континентам, этот код будет делать то, что вы хотите. Он выполняет итерации по каждому континенту в массиве, используя пользовательскую функцию сортировки для сортировки по значению population для каждой страны. Чтобы иметь дело с динамическими c ключами внутри страны, мы используем current, чтобы получить первый элемент массива, из которого мы можем затем получить basicInfo и затем population:

$array = array_map(function ($arr) {
    uasort($arr, function ($a, $b) {
        return current($b)['basicInfo']['population'] - current($a)['basicInfo']['population'];
    });
    return $arr;
}, $array);
print_r($array);

Демонстрация на 3v4l.org

Обратите внимание, что сортировать во время генерации массива не имеет смысла, так как вам все равно придется сортировать его после вставки последнего значения , Так что просто запустите свой l oop и затем сортируйте ...

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