我需要按名称合并关联数组和组。说我有这样的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个元素)。每个数组可能有不同的大小。
答案 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
)