PHP中如何对相同条件的数组visitor_cv值进行求和?
合并数组中相同字段组合的
visitor_cv值的实现方案 嘿,我来帮你搞定这个数组合并的需求!你需要当visitor_day、visitor_id和type这三个字段值完全一致时,把对应的visitor_cv数值相加,合并成一条记录对吧?下面给你两种PHP的实现方法,都是容易理解和复用的:
方法一:遍历数组构建唯一键合并(最直观)
先明确你的原始数组(简化后):
$originalArray = [ 6 => ['type' => 'mail', 'visitor_id' => 4, 'visitor_day' => 20180516, 'visitor_cv' => 1], 13 => ['type' => 'mail', 'visitor_id' => 4, 'visitor_day' => 20180516, 'visitor_cv' => 1], 23 => ['type' => 'skype', 'visitor_id' => 4, 'visitor_day' => 20180516, 'visitor_cv' => 1], 36 => ['type' => 'skype', 'visitor_id' => 4, 'visitor_day' => 20180516, 'visitor_cv' => 1], ];
实现代码如下:
$mergedArray = []; foreach ($originalArray as $item) { // 用三个字段拼接成唯一键,确保相同组合的项归到同一键下 $key = $item['type'] . '_' . $item['visitor_id'] . '_' . $item['visitor_day']; if (isset($mergedArray[$key])) { // 键已存在则累加visitor_cv $mergedArray[$key]['visitor_cv'] += $item['visitor_cv']; } else { // 键不存在则直接存入当前项 $mergedArray[$key] = $item; } } // 重置索引得到纯结果数组(可选,若不需要拼接键则执行) $finalResult = array_values($mergedArray); // 输出结果 print_r($finalResult);
逻辑说明:
- 遍历原始数组的每一项,用
type、visitor_id、visitor_day拼接成唯一字符串作为新数组的键,相同字段组合的项会自动匹配到同一个键。 - 若键已存在,就把当前项的
visitor_cv加到已有值上;若不存在,直接将当前项存入新数组。 - 最后用
array_values()可以去掉拼接的自定义键,得到你期望的纯索引数组。
方法二:使用array_reduce函数(更简洁)
如果你偏好函数式编程的写法,array_reduce是个不错的选择:
$finalResult = array_values(array_reduce($originalArray, function ($carry, $item) { $key = $item['type'] . '_' . $item['visitor_id'] . '_' . $item['visitor_day']; if (isset($carry[$key])) { $carry[$key]['visitor_cv'] += $item['visitor_cv']; } else { $carry[$key] = $item; } return $carry; }, [])); print_r($finalResult);
逻辑说明:
array_reduce会迭代数组的每一项并传入回调函数,$carry是存储合并结果的累加器。- 核心逻辑和方法一完全一致,只是用函数式写法实现,代码更紧凑。
运行任意一种方法后,都会得到你期望的结果:
Array ( [0] => Array ( [type] => mail [visitor_id] => 4 [visitor_day] => 20180516 [visitor_cv] => 2 ) [1] => Array ( [type] => skype [visitor_id] => 4 [visitor_day] => 20180516 [visitor_cv] => 2 ) )
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

