Объединить элементы массива в один массив с тремя слоями на основе ключей

У меня есть большой массив событий из моей базы данных, который структурирован следующим образом:

$events = array(
    // Sept 10 2018
    array(
        2018 => array(
            9 => array(
                10 => array(
                    'event01'
                )
            )
        )
    ),
    // Sept 20 2018
    array(
        2018 => array(
            9 => array(
                20 => array(
                    'event02'
                )
            )
        )
    ),
    // Oct 5 2019
    array(
        2018 => array(
            10 => array(
                5 => array(
                    'event03'
                )
            )
        )
    )
);

Что мне нужно структурировать так:

$result = array(
    2018 => array(
        // September
        9 => array(
            10 => array(
                'event01'
            ),
            20 => array(
                'event02'
            )
        ),
        // October
        10 => array(
            5 => array(
                'event03'
            )
        )
    )
);

Я пытаюсь соединить его с array_key_exists в трех foreach, но я не добился большого прогресса и не уверен, что это лучший способ сделать это. Структура исходного массива - это фиксированный формат, а данные - динамические.

Кто-нибудь поможет? Заранее спасибо.

чтобы улучшить свой опыт работы с SO, прочтите, как задать По теме вопроса, Контрольный список вопросов и идеальный вопрос, и как создать Минимальный, полный и проверяемый пример. Как и почти все вопросы по SO, если вы покажете какой-то код, вы получите лучший ответ от сообщества

RiggsFolly 21.09.2018 14:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать 3 цикла foreach для достижения вашего результата;

$eventFiltered = [];
foreach ($events as $eventByYear) {
    foreach ($eventByYear as $year => $eventByMonth) {
        foreach ($eventByMonth as $month => $eventByDay) {
            $eventFiltered[$year][$month][key($eventByDay)][] = $eventByDay[key($eventByDay)][0];
        }
    }
}
echo "<pre>";
print_r($eventFiltered);
exit;

Ваш вывод будет;

// Output; $eventFiltered

Array
(
    [2018] => Array
        (
            [9] => Array
                (
                    [10] => Array
                        (
                            [0] => event01
                        )

                    [20] => Array
                        (
                            [0] => event02
                        )

                )

            [10] => Array
                (
                    [5] => Array
                        (
                            [0] => event03
                        )

                )

        )

)

Спасибо! Это позволило мне отфильтровать события одного дня. Спасатель жизни ?

Suika 21.09.2018 14:30

Да; то есть я имею в виду, что вы также можете захотеть провести мероприятие в тот же день; Я тоже задал тот же вопрос @iainn

Divyesh Prajapati 21.09.2018 14:31

Никаких циклов писать не нужно, просто передайте все элементы массива в array_replace_recursive:

$merged = array_replace_recursive(...$events);

Это также имеет то преимущество, что он будет работать с произвольным количеством уровней, поэтому, если структура изменится в будущем, код не должен.

См. https://3v4l.org/BP556

Если у меня будет более одного мероприятия в один и тот же день, будет указано только последнее событие в этот день; что, если я хочу все мероприятие?

Divyesh Prajapati 21.09.2018 14:29

Не знал, что это можно использовать таким образом, но да, может быть проблема, если в день происходит более одного события. Спасибо, еще!

Suika 21.09.2018 14:31

@DivyeshPrajapati Не уверен, что понимаю, извините - результат в моем примере соответствует тому, что в вопросе. Если какой-либо из листовых узлов имеет более одного элемента, все они будут присутствовать в результате.

iainn 21.09.2018 14:33

Да, это соответствует точному o / p, но я подумал, что, если более одного мероприятия в один и тот же день? Вот почему я спросил, можно ли это сделать с какой-либо функцией массива или нет.

Divyesh Prajapati 21.09.2018 14:36

@DivyeshPrajapati Я все еще не понимаю, о чем вы. Если в один и тот же день происходит более одного события, они все будут в результате. Что вы имеете в виду он даст только последнее событие в этот день?

iainn 21.09.2018 14:50

Ваш входной массив отличается; посмотри, что я имею в виду, paiza.io/projects/3G4gPQYEIQU-XOBlKo1QXw

Divyesh Prajapati 21.09.2018 15:13

Другие вопросы по теме