PHP Unique / SUM / Merge数组操作

时间:2012-12-21 19:10:52

标签: php arrays merge unique

这很难用文字解释,但基本上我需要采用两个数组,将它们与唯一值合并并对其中一列进行求和。在下面写出来时更有意义:

$a = array(
   0 => array(
      'ID' => 1,
      'Count' => 2
   ),
);

$b = array(
   0 => array(
      'ID' => 1,
      'Count' => 4,
   ),
   1 => array(
      'ID' => 2,
      'Count' => 3,
   ),
);

我需要最终产品:

$a_plus_b = array(
    0 => array(
       'ID' => 1,
       'Count' => 6,
    ),
    1 => array(
       'ID' => 2,
       'Count' => 3,
    ),        
);

我一直在玩array_merge()和array_unique()的不同变体,但我找不到高效的方式来做我需要的事情。我知道我总是可以做嵌套循环,但我希望能有更轻松的东西。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题

注意:此解决方案需要PHP >= 5.3。有一个PHP< 5.3下面的解决方案。

$input = array($a, $b);
// add as many result arrays to $input as you want; e.g.,
// $input = array($a, $b, $c, $d);

$output = array_count_values(
  call_user_func_array(
    'array_merge',
     array_map(
       function($arr) {
         return array_fill(0, $arr['Count'], $arr['ID']);
       },
       call_user_func_array(
         'array_merge',
         $input
       )
     )
  )
);

print_r($output);

输出

Array
(
    [1] => 6
    [2] => 3
)

注意以上数组键的值为ID。数组值为Count值。


如果您正在运行PHP < 5.2,则无法使用array_fill的内联闭包。您必须将其定义为单独的函数。

$input = array($a, $b);

function _fill($arr) {
  return array_fill(0, $arr['Count'], $arr['ID']);
}

$output = array_count_values(
  call_user_func_array(
    'array_merge',
    array_map(
      '_fill',
      call_user_func_array(
        'array_merge',
        $input
      )
    )
  )
);

print_r($output);

从这里,将输出转换为您想要的格式是一项微不足道的任务。

答案 1 :(得分:0)

请不要过度设计这样一项基本任务。使用单个循环迭代两个数组并使用 ID 值分配临时键。如果多次遇到相应的 ID 键,只需将新的 Count 值添加到存储的值中。

代码:(Demo)

$result = [];
foreach (array_merge($a, $b) as $row) {
    if (!isset($result[$row['ID']])) {
        $result[$row['ID']] = $row;
    } else {
        $result[$row['ID']]['Count'] += $row['Count'];
    }
}
var_export(array_values($result));

输出:

array (
  0 => 
  array (
    'ID' => 1,
    'Count' => 6,
  ),
  1 => 
  array (
    'ID' => 2,
    'Count' => 3,
  ),
)

也可以使用函数式编程来实现相同的结果 -- array_reduce() 是理想的,因为输出中的元素数将等于或小于输入数据中的元素数。

>

代码:(Demo)

var_export(
    array_values(
        array_reduce(
            array_merge($a, $b),
            function ($result, $row) {
                if (!isset($result[$row['ID']])) {
                    $result[$row['ID']] = $row;
                } else {
                    $result[$row['ID']]['Count'] += $row['Count'];
                }
                return $result;
            },
            []
        )
    )
);