You need to enable JavaScript to run this app. PHP 二维数组按子数组内color键值去重的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 09:06:03