【问题标题】:Merge and group by several arrays按多个数组合并和分组
【发布时间】:2011-08-10 12:27:33
【问题描述】:

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

【问题讨论】:

  • 你输入的是数组还是SQL数据?困惑。
  • 抱歉造成混淆,我把 SQL 语句作为我在 PHP 中需要的类比。

标签: php arrays associative-array


【解决方案1】:

[编辑:我调整了函数(如 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;
}

【讨论】:

  • array_key_exists() 有不同的参数语法。第一个键,然后是数组。
【解决方案2】:

一种可能的方式

$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

【讨论】:

  • 完美运行。非常适合我的情况:) 刚刚添加了 array_key_exists($key,$resultgarray) 条件来消除通知。谢谢!
  • 你可以使用if (!isset($rtn[$key])) { $rtn[$key] = 0; }
【解决方案3】:

您可以使用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
)

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2016-12-30
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多