根据键将数组项合并为一个具有三层的数组
Merge array items into one array with three layers based on keys
我的数据库中有大量事件,它们的结构如下:
$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'
)
)
)
);
我试图在三个 foreach
中将它与 array_key_exists
放在一起,但我没有取得太大进展,并且不确定这是否是最好的方法。初始数组的结构是固定格式,数据是动态的。
有人帮忙吗?提前致谢。
您可以使用 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
)
)
)
)
不需要写任何循环,只需要将数组的所有元素传递给array_replace_recursive
:
$merged = array_replace_recursive(...$events);
这还有一个好处,即它可以在任意数量的级别上工作,因此如果将来结构发生变化,则代码不必如此。
我的数据库中有大量事件,它们的结构如下:
$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'
)
)
)
);
我试图在三个 foreach
中将它与 array_key_exists
放在一起,但我没有取得太大进展,并且不确定这是否是最好的方法。初始数组的结构是固定格式,数据是动态的。
有人帮忙吗?提前致谢。
您可以使用 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
)
)
)
)
不需要写任何循环,只需要将数组的所有元素传递给array_replace_recursive
:
$merged = array_replace_recursive(...$events);
这还有一个好处,即它可以在任意数量的级别上工作,因此如果将来结构发生变化,则代码不必如此。