Слияние и группировка по нескольким массивам - PullRequest
1 голос
/ 10 августа 2011

Мне нужно объединить ассоциативные массивы и группу по имени. Скажем, у меня есть 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 ]

2 голосов
/ 10 августа 2011

[РЕДАКТИРОВАТЬ: я адаптировал функцию (как предложил Джон Грин) для использования 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 голос
/ 10 августа 2011

Вы можете использовать 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
)
1 голос
/ 10 августа 2011

один из возможных способов

$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

...