PHP:合并连续相同ID的数组,保留首value与末sec值
解决连续相同ID元素合并的PHP实现方案
嘿,这个需求我刚好碰到过类似的,下面给你一个简单易懂的实现思路和代码:
核心思路
我们需要只合并连续相同ID的元素,所以不需要先把所有相同ID的元素提前分组,而是边遍历边判断处理:
- 先把原数组的第一个元素作为初始分组的起点
- 从第二个元素开始遍历,每次对比当前元素的ID和结果数组最后一个元素的ID
- 如果ID相同,就更新当前分组的
sec为当前元素的sec(因为要取组内最后一个元素的sec) - 如果ID不同,就把当前元素作为新的分组加入结果数组
- 如果ID相同,就更新当前分组的
完整代码实现
<?php // 原始数组 $results = array( array('value' => 100, 'ID' => 333, 'sec' => 200), array('value' => 200, 'ID' => 333, 'sec' => 300), array('value' => 300, 'ID' => 555, 'sec' => 400), array('value' => 400, 'ID' => 555, 'sec' => 500), array('value' => 500, 'ID' => 333, 'sec' => 600) ); // 处理逻辑 $merged = []; if (!empty($results)) { // 初始化第一个分组 $merged[] = $results[0]; // 从第二个元素开始遍历 for ($i = 1; $i < count($results); $i++) { $current = $results[$i]; $lastMerged = &$merged[count($merged)-1]; // 引用最后一个元素,方便直接修改 if ($current['ID'] === $lastMerged['ID']) { // ID相同,更新sec为当前元素的sec(取组内最后一个值) $lastMerged['sec'] = $current['sec']; } else { // ID不同,添加新的分组 $merged[] = $current; } } } // 输出合并后的结果 print_r($merged); ?>
运行结果
执行上面的代码后,输出的合并数组会是:
Array ( [0] => Array ( [value] => 100 [ID] => 333 [sec] => 300 ) [1] => Array ( [value] => 300 [ID] => 555 [sec] => 500 ) [2] => Array ( [value] => 500 [ID] => 333 [sec] => 600 ) )
关键点说明
- 使用引用
&$merged[count($merged)-1]直接修改结果数组的最后一个元素,避免重复取值赋值,提升处理效率 - 先判断原数组是否为空,防止数组为空时出现索引错误
- 用
===严格判断ID相等,避免类型转换带来的意外问题
内容的提问来源于stack exchange,提问作者qaakmnd
相关产品推荐
相关产品推荐

