如何使用isset()和foreach查找两个不同数组中的唯一值
两个数组取唯一值的解决方案
原有代码问题
- 逻辑判断错误:
isset($arr1[$val2])是判断$val2是否为$arr1的索引键,而非判断$val2是否是$arr1的元素值,和你要判断值是否重合的需求完全不符 - 嵌套循环导致重复输出:两层循环每次满足条件就直接输出,会触发多次重复打印,自然出现冗余内容
- 缺少结果过滤逻辑:没有提前对公共值做排除,自然会输出两个数组都存在的元素
最优实现方案(使用PHP内置函数)
PHP已经内置了直接计算数组差集的函数,性能比自定义遍历高很多,也不会出现逻辑错误:
只获取第一个数组独有的值
使用array_diff函数,返回第一个数组中存在、且其他所有参数数组中都不存在的值:
$arr1 = [1,3,7,10,13]; $arr2 = [7,4,1,5,3]; $uniqueInArr1 = array_diff($arr1, $arr2); // 输出结果:10 13 echo implode(' ', $uniqueInArr1);
获取两个数组各自独有的所有唯一值
分别计算两个数组的差集后合并即可:
$uniqueAll = array_merge(array_diff($arr1, $arr2), array_diff($arr2, $arr1)); // 输出结果:10 13 4 5 echo implode(' ', $uniqueAll);
自定义遍历实现(如果需要自己写逻辑)
如果不使用内置函数,建议先把对照数组的元素转为关联数组的键,用isset做O(1)复杂度的存在判断,避免嵌套循环:
$arr1 = [1,3,7,10,13]; $arr2 = [7,4,1,5,3]; // 把arr2的元素转为键,方便快速判断存在性 $arr2Map = array_flip($arr2); $result = []; foreach ($arr1 as $val) { // 只保留不在arr2中存在的元素 if (!isset($arr2Map[$val])) { $result[] = $val; } } // 最后统一输出,不会有重复内容 echo implode(' ', $result);
内容的提问来源于stack exchange,提问作者Gev
相关产品推荐
相关产品推荐

