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
相关产品推荐
相关产品推荐

