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

时间:2018-09-21 12:03:08

标签: php arrays array-merge

我数据库中有很多事件的结构如下:

$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结合在一起,但是我并没有取得太多进展,也不确定这是否是最好的方法。初始数组的结构是固定格式,数据是动态的。

有帮助吗?预先感谢。

2 个答案:

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

这还具有可以在任意数量的级别上使用的优势,因此,如果将来结构发生变化,则代码不必这样做。

请参见https://3v4l.org/BP556