PHP多维数组如何按指定键去重 保留同键值最后一条记录
PHP按指定字段去重、保留同值最后一条记录实现方案
你之前使用的$input = array_map("unserialize" , array_unique(array_map("serialize", $input)));是全条目匹配去重方案,会比对整条记录的所有字段,只有整条记录完全相同时才会触发去重,既无法指定仅按status字段判重,也不支持自定义保留规则,无法满足当前需求。
实现思路
要实现「相同status值仅保留最后出现条目」的需求,逻辑非常直接:
- 先将原数组倒序,此时同
status的多条记录里,最先被遍历到的就是原数组中最后出现的目标条目 - 用临时结构记录已经处理过的
status值,遍历过程中仅保留第一次碰到的(也就是原数组最后出现的)对应status条目 - 遍历完成后如果需要保持原数组的条目先后顺序,把结果再倒序一次即可
可直接运行的代码示例
// 示例输入:元素为stdClass对象的多维数组 $input = [ (object)['id' => 1, 'status' => 'accepted', 'create_time' => '2024-05-01 09:00'], (object)['id' => 2, 'status' => 'on_his_way', 'create_time' => '2024-05-01 09:10'], (object)['id' => 3, 'status' => 'accepted', 'create_time' => '2024-05-01 09:20'], (object)['id' => 4, 'status' => 'picked_up', 'create_time' => '2024-05-01 09:30'], (object)['id' => 5, 'status' => 'on_his_way', 'create_time' => '2024-05-01 09:40'], ]; $seenStatus = []; $filtered = []; // 倒序遍历 foreach (array_reverse($input) as $record) { // 性能优化:用关联数组键做查找,比in_array效率高很多,适合大数组场景 if (!isset($seenStatus[$record->status])) { $seenStatus[$record->status] = true; $filtered[] = $record; } } // 需要保持原数组先后顺序则执行倒序,不需要可注释该行 $filtered = array_reverse($filtered);
以上示例代码执行后,会保留id=3(最后一条accepted状态)、id=5(最后一条on_his_way状态)、id=4(唯一一条picked_up状态)三条记录,完全匹配需求。
内容的提问来源于stack exchange,提问作者geeth
相关产品推荐
相关产品推荐

