这很难用文字解释,但基本上我需要采用两个数组,将它们与唯一值合并并对其中一列进行求和。在下面写出来时更有意义:
$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()的不同变体,但我找不到高效的方式来做我需要的事情。我知道我总是可以做嵌套循环,但我希望能有更轻松的东西。有什么想法吗?
答案 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;
},
[]
)
)
);