У меня есть большой массив событий из моей базы данных, который структурирован следующим образом:
$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, но я не добился большого прогресса и не уверен, что это лучший способ сделать это. Структура исходного массива - это фиксированный формат, а данные - динамические.
Кто-нибудь поможет? Заранее спасибо.






Вы можете использовать 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
)
)
)
)
Спасибо! Это позволило мне отфильтровать события одного дня. Спасатель жизни ?
Да; то есть я имею в виду, что вы также можете захотеть провести мероприятие в тот же день; Я тоже задал тот же вопрос @iainn
Никаких циклов писать не нужно, просто передайте все элементы массива в array_replace_recursive:
$merged = array_replace_recursive(...$events);
Это также имеет то преимущество, что он будет работать с произвольным количеством уровней, поэтому, если структура изменится в будущем, код не должен.
Если у меня будет более одного мероприятия в один и тот же день, будет указано только последнее событие в этот день; что, если я хочу все мероприятие?
Не знал, что это можно использовать таким образом, но да, может быть проблема, если в день происходит более одного события. Спасибо, еще!
@DivyeshPrajapati Не уверен, что понимаю, извините - результат в моем примере соответствует тому, что в вопросе. Если какой-либо из листовых узлов имеет более одного элемента, все они будут присутствовать в результате.
Да, это соответствует точному o / p, но я подумал, что, если более одного мероприятия в один и тот же день? Вот почему я спросил, можно ли это сделать с какой-либо функцией массива или нет.
@DivyeshPrajapati Я все еще не понимаю, о чем вы. Если в один и тот же день происходит более одного события, они все будут в результате. Что вы имеете в виду он даст только последнее событие в этот день?
Ваш входной массив отличается; посмотри, что я имею в виду, paiza.io/projects/3G4gPQYEIQU-XOBlKo1QXw
чтобы улучшить свой опыт работы с SO, прочтите, как задать По теме вопроса, Контрольный список вопросов и идеальный вопрос, и как создать Минимальный, полный и проверяемый пример. Как и почти все вопросы по SO, если вы покажете какой-то код, вы получите лучший ответ от сообщества