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

PHP检测嵌套多维数组内子数组是否存在重复name值的方法

嵌套数组分组内name字段重复值校验方案

校验规则为每个内层子数组分组内,name字段值必须唯一,跨分组的同名name属于合法情况,需要精准识别同分组内的重复name值,同时支持直接生成错误提示。

实现代码

$elements = [];

$elements[18][20] = [
    [
        'name'  => 'Color',
        'value' => 'Red'
    ],
    [
        'name'  => 'Color',
        'value' => 'Green'
    ],
    [
        'name'  => 'Size',
        'value' => 'S'
    ]
];
$elements[18][21] = [
    [
        'name'  => 'Size',
        'value' => 'S'
    ],
    [
        'name'  => 'Length',
        'value' => '20'
    ],
];

$duplicateInfo = [];
// 逐层遍历到存放条目的最内层分组
foreach ($elements as $firstKey => $secondLevel) {
    foreach ($secondLevel as $secondKey => $itemList) {
        $nameCount = [];
        // 统计当前分组内每个name的出现次数
        foreach ($itemList as $item) {
            $currentName = $item['name'];
            $nameCount[$currentName] = isset($nameCount[$currentName]) ? $nameCount[$currentName] + 1 : 1;
        }
        // 筛选出现次数大于1的name,即为当前分组内的重复值
        $duplicateNames = array_filter($nameCount, function($count) {
            return $count > 1;
        });
        if (!empty($duplicateNames)) {
            $duplicateInfo[] = [
                'group_key' => $firstKey . '.' . $secondKey,
                'duplicate_names' => array_keys($duplicateNames)
            ];
        }
    }
}

// 生成错误提示
if (!empty($duplicateInfo)) {
    $allDuplicateNames = array_unique(array_merge(...array_column($duplicateInfo, 'duplicate_names')));
    echo sprintf("您存在至少一个重复的name值:%s", implode('、', $allDuplicateNames));
    // 如需定位重复值所在分组,可直接输出$duplicateInfo查看
}

运行上述示例代码,会直接输出:您存在至少一个重复的name值:Color,完全匹配预期。

方案优势

  • 按独立分组单独统计name频次,不会出现跨分组同名误判的问题(比如示例中两个分组都存在name为Size的条目,属于合法情况,不会被判定为重复)
  • 时间复杂度为O(n),仅需遍历一次全量数据,比全量提取name后再做数组交集、差集计算的方案性能更高,数据量较大时优势明显
  • 不仅可以拿到所有重复的name值,还能定位到重复值具体所属的分组键,方便后续做精准的错误提示
  • 逻辑简单易扩展,后续如果需要新增name枚举校验、value格式校验等规则,可以直接在遍历当前分组条目时追加逻辑

原有方案的问题

之前采用双层循环全量提取name、再配合count()、array_intersect()判断的方案存在两个明显缺陷:

  • 把所有层级的name值混在一起统计,会把跨分组的合法同名值误判为重复
  • 仅能统计重复项的数量,无法直接拿到具体的重复name值,也无法定位重复值所属的位置

内容的提问来源于stack exchange,提问作者Mr. Jo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.11 16:16:22