отсортировать многомерный массив на основе поля в php - PullRequest
1 голос
/ 09 июля 2020

У меня есть многомерный массив, как показано ниже, в котором я хочу выполнить сортировку на основе поля [name] в php.

Array
(
    [chicago] => Array
        (
            [community_name] => Chicago, IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => HELLO WORLD.
                                )
                        )

                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Hello
                                )

                        )

                    [2] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Administration.
                                )
                        )
                )

        )

    [chicago-and-surrounding-areas] => Array
        (
            [community_name] => Chicago (and surrounding areas), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Carry.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Bacteria.
                                )
                        )   
                )

        )

    [cambridge-chicago] => Array
        (
            [community_name] => Cambridge (Chicago), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Responsibility.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Bacteria.
                                )
                        )   
                )

        )

)

Вот чего я хочу достичь:

Array
(
    [chicago] => Array
        (
            [community_name] => Chicago, IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Administration
                                )
                        )

                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Hello
                                )

                        )

                    [2] => Array
                        (
                            [name] => Array
                                (
                                    [0] => HELLO WORLD.
                                )
                        )
                )

        )

    [chicago-and-surrounding-areas] => Array
        (
            [community_name] => Chicago (and surrounding areas), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Bacteria.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Carry.
                                )
                        )   
                )

        )

    [cambridge-chicago] => Array
        (
            [community_name] => Cambridge (Chicago), IL
            [areas] => Array
                (
                    [0] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Bacteria.
                                )
                        )
                    [1] => Array
                        (
                            [name] => Array
                                (
                                    [0] => Responsibility.
                                )
                        )   
                )

        )

)

Это то, что я пробовал, но я думаю, что нужно сделать больше.

function cmp($a, $b)
{
    if ($a["name"] == $b["name"]) {
        return 0;
    }
    return ($a["name"] < $b["name"]) ? -1 : 1;
}

usort($response,"cmp");

Постановка проблемы:

Мне интересно, что изменится Мне нужно сделать код php выше, чтобы он сортировал массив на основе поля name. С моим кодом php выше он ничего не сортирует. Он просто печатает ввод как есть.

1 Ответ

1 голос
/ 09 июля 2020

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

$array = [
    'chicago' => [
        'community_name' => 'Chicago, IL',
        'areas' => [
            [
                'name' => ['HELLO WORLD.']
            ],
            [
                'name' => ['Hello'],
            ],
            [
                'name' => ['Administration.'],
            ],
        ],
    ],
    'chicago-and-surrounding-areas' => [
        'community_name' => 'Chicago (and surrounding areas), IL',
        'areas' => [
            [
                'name' => ['Carry.']
            ],
            [
                'name' => ['Bacteria.'],
            ],
        ],
    ],
    'cambridge-chicago' => [
        'community_name' => 'Cambridge (Chicago), IL',
        'areas' => [
            [
                'name' => ['Responsibility.']
            ],
            [
                'name' => ['Bacteria'],
            ],
        ],
    ],
];

foreach ($array as &$locality) {
    usort($locality['areas'], function ($a, $b) {
        return $a['name'][0] <=> $b['name'][0];
    });
}

var_dump($array);

Рабочий пример

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