最直接方式是用array_column提取所有id,再比较count($ids)与count(array_unique($ids))是否相等;不等即存在重复,但需注意null、空值过滤及类型混用导致的误判。

用 array_column 提取所有 id 再判断去重后长度是否变化
PHP 判断多维数组中是否存在重复 id,最直接的方式是先抽取出所有 id 值,再对比原始数量和去重后数量。前提是每个子数组都有 id 键且不为 null 或缺失。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
array_column($arr, 'id')拿出全部id值,它会自动跳过缺失id键的元素(返回null,但不会报错) - 用
array_filter($ids, 'is_numeric')或array_filter($ids, function($v) { return $v !== null && $v !== ''; })过滤掉无效值,避免把空字符串或null当作合法id参与去重 - 比较
count($ids)和count(array_unique($ids)),不等即存在重复
$arr = [
['id' => 1, 'name' => 'a'],
['id' => 2, 'name' => 'b'],
['id' => 1, 'name' => 'c'],
];
$ids = array_column($arr, 'id');
$ids = array_filter($ids, function($v) { return $v !== null; });
$hasDup = count($ids) !== count(array_unique($ids));
// $hasDup 为 true
遇到非数字 id 或字符串 id 时要注意 array_unique 的默认行为
array_unique 默认用 string 比较,所以 '1' 和 1 会被视为相同;如果业务中 id 类型混用(比如数据库里是字符串主键),可能误判重复。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 若需严格区分类型,改用
array_unique($ids, SORT_REGULAR) - 若所有
id都是整型,可先用array_map('intval', $ids)统一转换,再array_unique - 若含 UUID 等长字符串,确保没前后空格:
array_map('trim', $ids)再处理
要定位哪些 id 重复?用 array_count_values 找出频次 >1 的项
单纯知道“有重复”不够,调试或校验时往往需要知道哪个 id 重复了几次、出现在哪些位置。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
array_count_values($ids)返回[id => count]关联数组,遍历筛选count > 1的键即可 - 如需具体下标位置,得手动遍历原数组:
foreach ($arr as $i => $item) { if (isset($item['id'])) $map[$item['id']][] = $i; } - 注意:如果某个
id是0、false或空字符串,isset($item['id'])仍为true,但array_count_values会把它当有效值统计
$counts = array_count_values($ids);
$duplicates = array_keys(array_filter($counts, function($c) { return $c > 1; }));
// $duplicates = [1]
性能敏感场景别用 array_column + array_unique 套娃
当数组超大(比如 >10 万项),array_column 会生成一个新数组,array_unique 再扫一遍,内存和时间开销明显。这时更适合单次遍历 + 哈希标记。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 手动遍历,用临时
array当哈希表:if (isset($seen[$item['id']])) { /* 重复 */ } - 如果
id可能为null或非标量,先做类型断言或转成字符串再存键 - 对超大数据,考虑加
break早停(只需判断“是否存在”,不需列出全部重复项)
复杂点在于:你得自己处理键缺失、类型不一致、空值这些边界——而 array_column 默默帮你绕过了部分问题,代价是多一次遍历。



















