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
相关产品推荐
相关产品推荐

