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

PHP对象去重:按ID展示唯一值并统计重复次数

PHP对象去重:基于ID提取唯一值并统计重复次数

没问题,我来帮你搞定这个需求!下面是具体的思路和代码示例,完全贴合你的要求:

核心思路

  • 遍历所有对象,以ID为键建立映射表,把相同ID的对象归为一组
  • 首次遇到某ID时,复制原对象并添加duplicate_count属性初始化为1
  • 后续遇到重复ID时,直接给对应对象的计数加1
  • 最后将映射表转换为索引数组返回(也可以保留关联数组,看你需求)

完整代码示例

模拟输入数据

首先我们先定义一组测试用的对象数组:

// 模拟业务中的对象数组,这里用stdClass,自定义类也适用
$objects = [
    (object) ['id' => 1, 'name' => 'Apple', 'price' => 5.99],
    (object) ['id' => 2, 'name' => 'Banana', 'price' => 3.49],
    (object) ['id' => 1, 'name' => 'Apple', 'price' => 5.99],
    (object) ['id' => 3, 'name' => 'Orange', 'price' => 4.99],
    (object) ['id' => 1, 'name' => 'Apple', 'price' => 5.99],
    (object) ['id' => 2, 'name' => 'Banana', 'price' => 3.49],
];

实现去重与统计的函数

function deduplicateObjectsById(array $objects): array {
    $uniqueObjectsMap = [];

    foreach ($objects as $obj) {
        // 先校验对象是否存在id属性,避免报错(可根据业务调整,比如抛出异常)
        if (!property_exists($obj, 'id')) {
            continue;
        }

        $objId = $obj->id;
        if (!isset($uniqueObjectsMap[$objId])) {
            // 首次出现该ID:克隆对象并添加计数属性
            $uniqueObj = clone $obj;
            $uniqueObj->duplicate_count = 1;
            $uniqueObjectsMap[$objId] = $uniqueObj;
        } else {
            // 重复ID:计数+1
            $uniqueObjectsMap[$objId]->duplicate_count++;
        }
    }

    // 转换为索引数组返回(如果需要保留ID作为键,直接返回$uniqueObjectsMap即可)
    return array_values($uniqueObjectsMap);
}

调用并查看结果

$uniqueResult = deduplicateObjectsById($objects);

// 打印结果
print_r($uniqueResult);

输出结果示例

运行后你会得到这样的结果:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => Apple
            [price] => 5.99
            [duplicate_count] => 3
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => Banana
            [price] => 3.49
            [duplicate_count] => 2
        )

    [2] => stdClass Object
        (
            [id] => 3
            [name] => Orange
            [price] => 4.99
            [duplicate_count] => 1
        )
)

注意事项

  • 使用clone是为了避免修改原对象的引用,防止产生意外副作用
  • 如果你的对象是自定义类,且id是私有属性,需要添加getId()方法来获取ID,把$obj->id改成$obj->getId()即可
  • 如果同ID的对象存在属性不一致的情况,可以在重复时添加合并逻辑(比如取平均值、保留最新值等),这个可以根据你的业务需求调整

内容的提问来源于stack exchange,提问作者Ricky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:59:45