PHP创建无重复值多维数组时偶发重复项问题如何解决?
问题根源
你代码中的去重逻辑存在多处缺陷,是偶发重复的核心原因:
- 判断逻辑完全错误:你的
array_search($row['nieruchomosc'], ...) ==0条件,仅当搜索结果是下标0、或者搜索不到返回false(弱等于0)时才会触发插入。如果重复值已经存在于新数组的非0下标位置,array_search会返回对应非0下标,此时条件不成立,就会再次插入相同值,直接导致重复。 - 弱类型比较隐患:PHP中
==是弱比较,false == 0、0 == '0'都会返回true,会进一步触发预期外的判断结果。 - 效率极低:每次循环都执行
array_unique+array_column,需要完整遍历整个新数组,数据量稍大就会出现性能问题。 - 索引逻辑错误:无论是否插入新元素,
$I每次循环都会自增,会导致新数组下标不连续,后续操作可能出现隐患。
修复方案
改用临时哈希表做存在性判断,性能和准确性都有保障:
$data['obchody']= $this->audytp_m->audytpro_obch(); $data['obchody_wsp']= []; // 临时存储已存在的客户名称标识 $existedKeys = []; foreach ($data['obchody'] as $row) { $currentKey = $row['nieruchomosc']; // 仅当该客户名称未出现过时插入新数组 if (!isset($existedKeys[$currentKey])) { $data['obchody_wsp'][] = [ 'nieruchomosc' => $currentKey, 'AudytPROInformacjaOUsludze' => $row['AudytPROInformacjaOUsludze'], 'AudytPROCzestotliwoscObchodow' => $row['AudytPROCzestotliwoscObchodow'] ]; $existedKeys[$currentKey] = true; } } // 可选:清理临时变量 unset($existedKeys);
方案优势
- 存在性判断时间复杂度为O(1),远高于原有遍历搜索的方案,数据量大时性能优势更明显
- 用isset做强判断,完全避免弱类型比较的坑
- 新数组天然是连续下标,不需要手动维护索引变量
- 逻辑清晰,不会出现偶发重复的问题
内容的提问来源于stack exchange,提问作者Kordian Zadrożny
相关产品推荐
相关产品推荐

