首页 > 解决方案 > 需要合并具有相同键值对的单个数组元素

问题描述

我有一个关联数组,我需要合并具有相同日期的相应键 => 值对

Array
(
    [0] => Array
        (
            [CreatedDate] => 2019-03-20
            [Whreceived] => 1
        )

    [1] => Array
        (
            [CreatedDate] => 2019-02-24
            [Whreceived] => 1
        )

    [2] => Array
        (
            [CreatedDate] => 2019-03-21
            [Whreceived] => 1
        )

    [3] => Array
        (
            [CreatedDate] => 2019-03-20
            [InProcess] => 1
        )

    [4] => Array
        (
            [CreatedDate] => 2019-03-19
            [InProcess] => 1
        )

    [5] => Array
        (
            [CreatedDate] => 2019-03-25
            [OnHold] => 2
        )

    [6] => Array
        (
            [CreatedDate] => 2019-03-19
            [WhInwardDone] => 1
        )

)

预期产出

Array
(
    [0] => Array
        (
            [CreatedDate] => 2019-03-20
            [Whreceived] => 1
            [InProcess] => 1

        )

    [1] => Array
        (
            [CreatedDate] => 2019-02-24
            [Whreceived] => 1
        )

    [2] => Array
        (
            [CreatedDate] => 2019-03-21
            [Whreceived] => 1
        )



    [4] => Array
        (
            [CreatedDate] => 2019-03-19
            [InProcess] => 1
            [WhInwardDone] => 1

        )

    [5] => Array
        (
            [CreatedDate] => 2019-03-25
            [OnHold] => 2
        )



)

基本上我需要具有唯一日期及其所有对应值的单个数组

标签: phparrays

解决方案


您可以使用 来执行此操作array_reduce,检查新数组中是否存在日期,如果存在,则将当前值与该值合并,否则在新数组中创建一个新值。

$merged_array = array_reduce($array, function ($c, $v) {
    if (($k = array_search($v['CreatedDate'], array_column($c, 'CreatedDate'))) !== false) {
        $c[$k] = array_merge($c[$k], $v);
    }
    else {
        $c[] = $v;
    }
    return $c;
}, array());
print_r($merged_array);

或者你可以使用一个简单的 foreach 循环:-)

$merged_array = array();
foreach ($array as $v) {
    if (($k = array_search($v['CreatedDate'], array_column($merged_array, 'CreatedDate'))) !== false) {
        $merged_array[$k] = array_merge($merged_array[$k], $v);
    }
    else {
        $merged_array[] = $v;
    }
}

输出:

Array
(
    [0] => Array
        (
            [CreatedDate] => 2019-03-20
            [Whreceived] => 1
            [InProcess] => 1
        )
    [1] => Array
        (
            [CreatedDate] => 2019-02-24
            [Whreceived] => 1
        )
    [2] => Array
        (
            [CreatedDate] => 2019-03-21
            [Whreceived] => 1
        )
    [4] => Array
        (
            [CreatedDate] => 2019-03-19
            [InProcess] => 1
            [WhInwardDone] => 1
        )
    [5] => Array
        (
            [CreatedDate] => 2019-03-25
            [OnHold] => 2
        )
)

3v4l.org 上的演示


推荐阅读