根据键将数组项合并为一个具有三层的数组

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);

这还有一个好处,即它可以在任意数量的级别上工作,因此如果将来结构发生变化,则代码不必如此。

https://3v4l.org/BP556