2

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

$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() 的不同变体,但我找不到一种有效的方法来做我需要的事情。我知道我总是可以做嵌套循环,但我希望能做一些更简单的事情。有任何想法吗?

4

2 回答 2

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);

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

于 2012-12-21T19:25:14.917 回答
0

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

代码:(演示

$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()这是理想的,因为输出中的元素数量将等于或小于输入数据中的元素数量。

代码:(演示

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;
            },
            []
        )
    )
);
于 2021-07-21T10:06:33.997 回答