三级多维数组重复值检测问题求助
检测三级多维数组中的重复值
没问题,这个需求其实很好解决——核心就是先把嵌套的多维数组“扁平化”(或者在遍历过程中直接追踪已出现的值),再判断是否存在重复。下面给你两种实用的方案:
方案一:先扁平化数组,再对比长度
这种方法思路直观:先把所有层级的元素都收集到一维数组里,再通过去重前后的数组长度差异判断是否有重复。
首先,先把你的示例数组整理成标准PHP格式:
$array = [ [ ["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"], ["A", null, null] ] ];
然后写一个递归的扁平化函数:
function flattenArray($array) { $result = []; foreach ($array as $item) { if (is_array($item)) { // 递归处理嵌套数组,合并结果 $result = array_merge($result, flattenArray($item)); } else { $result[] = $item; } } return $result; }
使用的时候,只需要对比扁平化数组和去重后数组的长度:
$flatArray = flattenArray($array); $hasDuplicates = count($flatArray) !== count(array_unique($flatArray)); var_dump($hasDuplicates); // 输出 bool(true),符合你的预期
方案二:遍历过程中直接检测重复(更高效)
如果你的数组很大,方案一需要先完整遍历并存储所有元素,有点浪费内存。可以改成遍历到某个元素时,直接检查它是否已经出现过,一旦发现重复立刻返回结果:
function hasDuplicates($array) { $seen = []; // 用栈实现迭代遍历,避免递归深度过大导致的栈溢出 $stack = [$array]; while (!empty($stack)) { $current = array_pop($stack); foreach ($current as $item) { if (is_array($item)) { // 嵌套数组压入栈,后续处理 array_push($stack, $item); } else { // 检查当前元素是否已出现过 if (in_array($item, $seen)) { return true; } $seen[] = $item; } } } // 遍历完所有元素都没重复 return false; }
调用这个函数直接得到结果:
var_dump(hasDuplicates($array)); // 输出 bool(true)
额外说明
- 这两个方法都会把
null视为普通值,如果两个null也需要算作重复,它们都能正确识别;如果你的需求里null不算重复,可以在检查的时候加个判断:if ($item !== null && in_array($item, $seen)) - 方案二用迭代代替递归,更适合处理层级极深的数组,避免PHP的递归栈限制问题
内容的提问来源于stack exchange,提问作者kevin_marcus
相关产品推荐
相关产品推荐

