PHP实现数组同ID统一SeqNr、异ID自动递增的处理方法
按规则分配SeqNr的PHP实现
现有代码问题
原代码每次循环都将
$seqNr硬编码初始化为1,未维护ID与已分配编号的映射关系,也没有实现计数器递增逻辑,导致所有记录的SeqNr固定为1,不符合要求。
正确实现代码
<?php $array = [ ['id' => 111, 'name' => 'one'], ['id' => 111, 'name' => 'one'], ['id' => 111, 'name' => 'one'], ['id' => 222, 'name' => 'two'], ['id' => 333, 'name' => 'three'], ['id' => 444, 'name' => 'four'], ['id' => 444, 'name' => 'four'], ]; // 初始化两个核心变量: // 1. ID与已分配SeqNr的映射表,避免重复ID重复计数 // 2. 当前最新的SeqNr计数器,遇到新ID时递增 $idSeqMap = []; $currentSeq = 0; foreach ($array as $key => $value) { $id = $value['id']; // 判断当前ID是否已经分配过编号 if (!isset($idSeqMap[$id])) { // 首次出现的新ID,计数器+1后分配编号 $currentSeq++; $idSeqMap[$id] = $currentSeq; } // 直接取映射表中该ID对应的统一SeqNr $seqNr = $idSeqMap[$id]; // 按原逻辑输出结果 echo " ID: " . $id . " SeqNr " . $seqNr . PHP_EOL; // 如果需要将SeqNr写入每条记录,可开启下面这行 // $array[$key]['seq_nr'] = $seqNr; } ?>
代码逻辑说明
- 相同ID无论连续出现、还是后续再次出现,都直接复用映射表中已分配的SeqNr,保证取值统一
- 只有首次遇到的新ID才会触发计数器递增,完全符合「新ID在前一个已分配SeqNr基础上依次递增」的规则
- 支持任意顺序的ID排列,不需要提前对数组按ID排序
内容的提问来源于stack exchange,提问作者Kudos
相关产品推荐
相关产品推荐

