在php数据整理的工作中,数组去重是高频操作,常规的正向去重只能保留第一次出现的元素,但实际场景中可能需要同时保留正向和反向去重的结果,实现双向去重的合并效果,满足更灵活的数据处理需求。

正向去重与反向去重的逻辑说明
正向去重是指按照数组原有的顺序,保留每个元素第一次出现的位置,后续重复的元素全部移除,这是php内置函数array_unique的默认行为。反向去重则是先将数组反转,再执行去重操作,最后再把结果反转回来,这样保留的是每个元素最后一次出现的位置。
正向去重的实现
直接使用php的array_unique函数即可完成正向去重,该函数会保留数组键名,返回去重后的数组。
<?php $testArray = [1, 2, 2, 3, 4, 4, 5]; // 正向去重,保留第一次出现的元素 $forwardUnique = array_unique($testArray); // 重置数组键名,让索引从0开始 $forwardUnique = array_values($forwardUnique); print_r($forwardUnique); ?>
上述代码执行后,输出结果为Array([0]=>1 [1]=>2 [2]=>3 [3]=>4 [4]=>5),重复的元素2和4只保留了第一次出现的位置。
反向去重的实现
反向去重需要先通过array_reverse反转数组,再调用array_unique去重,最后再次反转数组得到最终结果。
<?php $testArray = [1, 2, 2, 3, 4, 4, 5]; // 第一步:反转数组 $reversedArray = array_reverse($testArray); // 第二步:对反转后的数组去重,此时保留的是原数组中元素最后一次出现的位置 $reverseUniqueReversed = array_unique($reversedArray); // 第三步:再次反转数组,恢复原顺序 $reverseUnique = array_reverse($reverseUniqueReversed); // 重置数组键名 $reverseUnique = array_values($reverseUnique); print_r($reverseUnique); ?>
上述代码执行后,输出结果为Array([0]=>1 [1]=>2 [2]=>3 [3]=>4 [4]=>5),看起来和正向去重结果一致,是因为测试数组的重复元素是连续出现的,如果重复元素不连续,结果会有差异。
双向去重结果的合并策略
双向去重的核心是将正向去重和反向去重的结果合并,同时避免合并后出现新的重复元素,通常可以使用array_merge合并两个数组,再用array_unique对合并结果做一次去重,或者用array_merge结合array_diff把反向去重中独有的元素合并到正向去重结果中。
合并策略一:直接合并后整体去重
这种方式逻辑简单,先合并两个去重结果,再对合并后的数组做一次去重,确保没有重复元素。
<?php $testArray = [1, 2, 3, 2, 4, 3, 5]; // 正向去重 $forwardUnique = array_values(array_unique($testArray)); // 反向去重 $reversedArray = array_reverse($testArray); $reverseUniqueReversed = array_unique($reversedArray); $reverseUnique = array_values(array_reverse($reverseUniqueReversed)); // 合并两个结果 $mergedArray = array_merge($forwardUnique, $reverseUnique); // 对合并结果去重 $finalResult = array_values(array_unique($mergedArray)); print_r($forwardUnique); print_r($reverseUnique); print_r($finalResult); ?>
执行上述代码,正向去重结果为Array([0]=>1 [1]=>2 [2]=>3 [3]=>4 [4]=>5),反向去重结果为Array([0]=>1 [2]=>3 [3]=>4 [4]=>5),合并后去重的最终结果为Array([0]=>1 [1]=>2 [2]=>3 [3]=>4 [4]=>5)。
合并策略二:取反向去重独有元素合并
这种方式先找出反向去重结果中,正向去重结果不存在的元素,再把这些独有元素合并到正向去重结果中,避免重复处理相同元素。
<?php $testArray = [1, 2, 3, 2, 4, 3, 5]; // 正向去重 $forwardUnique = array_values(array_unique($testArray)); // 反向去重 $reversedArray = array_reverse($testArray); $reverseUniqueReversed = array_unique($reversedArray); $reverseUnique = array_values(array_reverse($reverseUniqueReversed)); // 找出反向去重中正向去重没有的元素 $diffElements = array_diff($reverseUnique, $forwardUnique); // 合并结果 $finalResult = array_merge($forwardUnique, $diffElements); // 重置键名 $finalResult = array_values($finalResult); print_r($finalResult); ?>
这种策略的效率会更高一些,因为不需要对合并后的整个数组做去重操作,只需要处理差异元素。
实际场景中的注意事项
在实际使用双向去重时,需要注意几个问题。首先是数组元素的类型,array_unique默认会对元素做字符串转换比较,所以数字和字符串形式的数字会被判定为重复元素,比如1和'1'会被认为是同一个元素。其次是键名的处理,去重后原键名会保留,通常需要调用array_values重置键名,方便后续使用。最后是大数据量数组的处理,双向去重需要两次去重和一次合并操作,数据量过大时需要考虑性能问题,可以优先使用第二种合并策略减少计算量。
phparray_uniquearray_merge双向去重数组处理修改时间:2026-06-20 23:06:34