PHP合并数组数组和增量值?

时间:2016-04-19 15:28:07

标签: php arrays

我有以下数组结构:

[0] => Array
    (
        [name] => Spinat boller
        [amount] => 3
        [category] => Bløddej og Boller
        [unit_amount] => 15
    )

[1] => Array
    (
        [name] => Bedste boller
        [amount] => 15
        [category] => Bløddej og Boller
        [unit_amount] => 15
    )

[2] => Array
    (
        [name] => Grov boller
        [amount] => 15
        [category] => Bløddej og Boller
        [unit_amount] => 15
    )

我有多个这些数组,我想将它们合并到AMOUNT KEY上。这意味着如果我有另一个包含这个的数组:

[0] => Array
    (
        [name] => Spinat boller
        [amount] => 2
        [category] => Bløddej og Boller
        [unit_amount] => 15
    )

我合并它,它会显示:

[0] => Array
    (
        [name] => Spinat boller
        [amount] => 5
        [category] => Bløddej og Boller
        [unit_amount] => 15
    )

显然我可以手动遍历这个,但我希望我能以某种方式利用PHP Merge功能,但不知道如何去做。

谢谢大家!

*编辑1 * 如果我只是执行array_merge函数,它只是将它们全部附加在一起,所以我来自:

[0] => Array
(
    [name] => Spinat boller
    [amount] => 3
    [category] => Bløddej og Boller
    [unit_amount] => 15
)

为:

[0] => Array
(
    [name] => Spinat boller
    [amount] => 3
    [category] => Bløddej og Boller
    [unit_amount] => 15
)
[0] => Array
(
    [name] => Spinat boller
    [amount] => 2
    [category] => Bløddej og Boller
    [unit_amount] => 15
)

但我想:

[0] => Array
(
    [name] => Spinat boller
    [amount] => 3
    [category] => Bløddej og Boller
    [unit_amount] => 15
)

[0] =>排列     (         [name] => Spinat boller         [金额] =>五         [category] ​​=> BløddejogBoller         [unit_amount] => 15     )

注意金额现在是5(其他数组有2和3)。其他所有内容都相同且匹配,只需添加和增加金额。

1 个答案:

答案 0 :(得分:0)

所以我考虑了一下,看看是否有可能在单个表达式中进行。

您必须组合相当多的功能,但行为与手动迭代相同。这种功能方法的结果如下所示:

$result = array_values(
    array_merge(
        ...array_reverse(
            array_map(function ($arr) {
                return array_combine(
                    array_column($arr, 'name'),
                    array_values($arr)
                );
            }, [$arr1, $arr2, $arr3])
        )
    )
);

虽然可以做到,但我坚持使用迭代方法最好是出于可维护性原因:

$tmp = [];

foreach ($arrays as $arr) {
    foreach ($arr as $elem) {
        if (!isset($tmp[$elem['name']])) {
            $tmp[$elem['name']] = $elem;
        }
    }
}

$result = array_values($tmp);