Слияние и группировка по нескольким массивам
Мне нужно объединить ассоциативные массивы и группы по имени. Скажем, у меня есть 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,
Мне нужно объединить эти массивы в один и сгруппировать их по filepath и получить результат суммы их значений. Что-то вроде:
SELECT filename, SUM(val) FROM files
GROUP BY filename
Но с несколькими входными массивами. Массивы короткие (максимум 20 элементов). Каждый массив может иметь разный размер.
3 ответа
один из возможных способов
$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
[РЕДАКТИРОВАТЬ: я адаптировал функцию (как предложил Джон Грин) для использования 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;
}
Вы можете использовать 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
)