PHP 二维数组按子数组内color键值去重的实现方法
二维数组按子层级color键去重的实现方法
现有代码失效的核心原因
原代码直接对每个子数组调用array_unique,但array_unique的默认对比规则是将元素转为字符串后做相等判断。由于子数组的元素本身是关联数组,所有关联数组转为字符串时都会统一输出Array,因此函数会将每个子数组的所有元素判定为重复,最终只保留每个子数组的第一个元素,和预期偏差极大。
可正确实现需求的方案
我们需要针对每个一级子数组做独立遍历,以元素的color键值作为去重判定依据,保留首次出现的元素、跳过后续重复条目即可。
实现代码(兼容所有PHP版本)
$array = [ [ ['color' => 'RED'], ['color' => 'BLUE'], ['color' => 'GREEN'] ], [ ['color' => 'RED'], ['color' => 'PURPLE'], ['color' => 'RED'] ] ]; $new_array = []; foreach ($array as $subArr) { $recordedColors = []; $dedupedSub = []; foreach ($subArr as $item) { $colorVal = $item['color']; // 仅保留未记录过的color值对应的元素 if (!in_array($colorVal, $recordedColors)) { $dedupedSub[] = $item; $recordedColors[] = $colorVal; } } $new_array[] = $dedupedSub; } echo json_encode($new_array);
输出结果(完全匹配预期)
[ [{"color":"RED"},{"color":"BLUE"},{"color":"GREEN"}], [{"color":"RED"},{"color":"PURPLE"}] ]
简洁版实现(PHP 5.3+ 支持)
如果偏好函数式写法,可以结合array_map和array_reduce简化逻辑,效果和上述代码完全一致:
$new_array = array_map(function ($subArr) { return array_reduce($subArr, function ($carry, $item) { $color = $item['color']; $isExist = in_array($color, array_column($carry, 'color')); if (!$isExist) { $carry[] = $item; } return $carry; }, []); }, $array);
注意:不要使用
array_unique($subArr, SORT_REGULAR)的简化写法,该方法以整个元素完全相等作为去重判定依据,一旦子数组元素包含color以外的其他键值,会导致同color但其他键不同的元素无法被去重,和需求规则不匹配。
规则说明
- 去重逻辑严格限定在每个子数组内部,不会跨子数组影响其他层级的元素
- 去重时保留元素的原有相对顺序,同color值的重复条目仅保留第一次出现的位置
- 无需修改原数组结构,输出和输入的层级结构完全对齐
内容的提问来源于stack exchange,提问作者pilotman
相关产品推荐
相关产品推荐

