我数据库中有很多事件的结构如下:
$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
结合在一起,但是我并没有取得太多进展,也不确定这是否是最好的方法。初始数组的结构是固定格式,数据是动态的。
有帮助吗?预先感谢。
答案 0 :(得分:1)
您可以使用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
)
)
)
)
答案 1 :(得分:1)
您无需编写任何循环,只需将数组的所有元素传递到array_replace_recursive
:
$merged = array_replace_recursive(...$events);
这还具有可以在任意数量的级别上使用的优势,因此,如果将来结构发生变化,则代码不必这样做。