由多个数组合并和分组

时间:2011-08-10 12:27:34

标签: php arrays associative-array

我需要按名称合并关联数组和组。说我有这样的3个数组:

ARRAY1
    "/path/file.jpg"  =>  2, 
    "/path/file2.bmp" =>  1,
    "/file3.gif"      => 5,

ARRAY2
    "/path/file.jpg"  =>  1, 
    "/path/file2.bmp" =>  1,
    "/file3.gif"      => 0,

ARRAY3
    "/path/file.jpg"  =>  1, 
    "/path/file2.bmp" =>  1,

我需要将这些数组合并为一个并按文件路径对它们进行分组,并得到它们的值之和的结果。类似的东西:

SELECT filename, SUM(val) FROM files
GROUP BY filename

但是有多个输入数组。数组较短(最多约20个元素)。每个数组可能有不同的大小。

3 个答案:

答案 0 :(得分:2)

[编辑:我调整了函数(由John Green建议)使用func_get_args,因此您无需在使用之前将所有单独的数组放在一个数组中。] < /强>

我认为您可以使用以下功能。

mergeArrays()
{
    $return = array();
    $arrays = func_get_args();
    foreach ($arrays as $array) {
        foreach ($array as $key => $val) {
            if (array_key_exists($key, $array) {
                $return[$key] += $val;
            } else {
                $return[$key] = $val;
            }
        }
    }
    return $return;
}

答案 1 :(得分:1)

一种可能的方式

$rtn = array();
foreach ($array1 as $key=>$val)
{
  $rtn[$key]+=$val;
}

foreach ($array2 as $key=>$val)
{
  $rtn[$key]+=$val;
}

foreach ($array2 as $key=>$val)
{
  $rtn[$key]+=$val;
}

以上内容会将filename, SUM(val)作为关联数组分配到$rtn

答案 2 :(得分:1)

您可以使用RecursiveArrayIterator

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($paths));
foreach ($iterator as $path => $value) {
    $summed[$path] = isset($summed[$path]) ? $summed[$path] + $value : $value;
}
print_r($summed);

array_walk_recursive以及关闭

$summed = array();
array_walk_recursive($paths, function($value, $path) use (&$summed) {
    $summed[$path] = isset($summed[$path]) ? $summed[$path] + $value : $value;
});

两者都会给出

Array
(
    [/path/file.jpg] => 4
    [/path/file2.bmp] => 3
    [/file3.gif] => 5
)