合并两个数组,第一个基于值,第二个基于键 - php

3

我有两个数组。

第一个数组名为"$periods",第二个数组名为"$groupExport",如下所示。

第一个数组 - $periods

Array
(
    [0] => 201308
    [1] => 201309
    [2] => 201310
)

Second Array - $groupExport

Array
(
    [0] => Array
        (
            [GroupCode] => 111
            [GroupDesc] => Crop Production
            [201308] => 1.5500
            [201309] => 240.4200
            [201310] => 41.2110
        )

    [1] => Array
        (
            [GroupCode] => 112
            [GroupDesc] => Animal Production
            [201309] => 3.1800
        )

    [2] => Array
        (
            [GroupCode] => 115
            [GroupDesc] => Agriculture, Forestry Support
            [201308] => 234.0400
            [201310] => 343.0200
        )
)

我已经尝试了至少5-6个不同的代码想法,它们都没有产生以下输出。我想要以下的输出,这样我就可以按照GroupCode、GroupDesc、201308、201309和201310的标题在表格格式中显示结果集。有人能帮我解决吗?

输出

Array
(
    [0] => Array
        (
            [GroupCode] => 111
            [GroupDesc] => Crop Production
            [201308] => 1.5500
            [201309] => 240.4200
            [201310] => 41.2110
        )

    [1] => Array
        (
            [GroupCode] => 112
            [GroupDesc] => Animal Production
            [201308] => 0
            [201309] => 3.1800
            [201310] => 0
        )

    [2] => Array
        (
            [GroupCode] => 115
            [GroupDesc] => Agriculture, Forestry Support
            [201308] => 234.0400
            [201309] => 0
            [201310] => 343.0200
        )
)

你尝试过但失败的代码在哪里? - crush
2个回答

3

循环遍历$groupExport数组,在每次迭代中,循环遍历子数组,并检查每个时间段索引是否存在。如果不存在,则用0进行初始化。

foreach ($groupExport as & $export) {
    foreach ($periods as $period) {
        if (!isset($export[$period])) {
            $export[$period] = 0;
        }
    }
}

请注意$export前面的&。这意味着我们通过引用传递数组 - 它在每次迭代中修改$groupExportDemo

谢谢回复,它正如我所期望的那样工作。如果只需要按升序排列周期为201308、201309、201310的情况,该如何修改这个工作代码? - Vinayagam
1
@Vinayagam 我不确定为什么需要这样做,但如果你想按键排序,请使用 ksort()。在外部 foreach 循环结束之前的最后一行添加 ksort($export) 就可以解决问题了。 - Darragh Enright
这种方法的好处是它不会改变原始数组。 - crush

2
注意:这会改变原始数组。如果你想生成一个新的数组,@AmalMurali的解决方案更好。
以下是另一种解决方案,使用了PHP的一些内置函数:
$keys = array_fill_keys($periods, 0);
array_walk($groupExport, function (&$item, $key, $keys) {
    $item += $keys;
}, $keys);

这里有一个在IDEOne.com上的演示。
解释
$keys = array_fill_keys($periods, 0);

这将把你的周期数组转换为一个新的数组,其中来自原始数组的值现在是键,而值是0
array_walk($groupExport, function (&$item, $key, $keys) {
    $item += $keys;
}, $keys);

我们遍历数组$groupExport的每个元素,并对每个成员应用一个函数。我们将每个数组元素作为引用传递给用户定义的函数,这使我们能够直接操纵它。
最后,我们将$keys添加到$item中,这实际上是合并两个数组并保持键关联。

输出

Array
(
    [0] => Array
        (
            [GroupCode] => 111
            [GroupDesc] => Crop Production
            [201308] => 1.55
            [201309] => 240.42
            [201310] => 41.211
        )

    [1] => Array
        (
            [GroupCode] => 112
            [GroupDesc] => Animal Production
            [201309] => 3.18
            [201308] => 0
            [201310] => 0
        )

    [2] => Array
        (
            [GroupCode] => 115
            [GroupDesc] => Agriculture, Forestry Support
            [201308] => 234.04
            [201310] => 343.02
            [201309] => 0
        )

)

  • array_fill_keys:使用指定的键和值填充数组
  • array_walk:对数组中的每个元素应用用户自定义的回调函数

这是一个非常棒的答案 - 我不知道有 array_fill_keys() 这个函数,也不知道你可以将额外的数据传递到 array_walk() 中。太棒了! - Darragh Enright
感谢您详细的回答。 - Vinayagam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接