You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:51:44