You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三级多维数组重复值检测问题求助

检测三级多维数组中的重复值

没问题,这个需求其实很好解决——核心就是先把嵌套的多维数组“扁平化”(或者在遍历过程中直接追踪已出现的值),再判断是否存在重复。下面给你两种实用的方案:

方案一:先扁平化数组,再对比长度

这种方法思路直观:先把所有层级的元素都收集到一维数组里,再通过去重前后的数组长度差异判断是否有重复。

首先,先把你的示例数组整理成标准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:17:32