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

PHP中按distributor_id优先级过滤重组数组的实现方案

如何按优先级合并PHP分类数组(保留当前用户条目优先)

我来帮你解决这个分类数组的去重与优先级保留问题——核心需求是:优先保留distributor_id等于当前用户$cod_id的条目,相同category_id的条目只留优先级高的(即用户自己的)。下面给你两种可行的实现方案,先把原数组转成更易读的PHP代码格式:

// 模拟原始输入数组
$originalCategories = [
    (object)[
        'category_id' => 5,
        'distributor_id' => 999999,
        'name' => 'Attractions',
        'parent_category_id' => 0,
        'is_global_category' => 0,
        'category_logo' => 'qrcodes/categoryupload/img_1438954822_attractions.png',
        'is_active' => 1,
        'ticket_ids' => '',
        'position' => 0
    ],
    (object)[
        'category_id' => 5,
        'distributor_id' => 8885, // 当前用户$cod_id的示例值
        'name' => 'Attractions',
        'parent_category_id' => 0,
        'is_global_category' => 0,
        'category_logo' => 'qrcodes/categoryupload/img_1438954822_attractions.png',
        'is_active' => 1,
        'ticket_ids' => '',
        'position' => 0
    ],
    (object)[
        'category_id' => 6,
        'distributor_id' => 999999,
        'name' => 'Walk & Bike',
        'parent_category_id' => 0,
        'is_global_category' => 0,
        'category_logo' => 'qrcodes/categoryupload/img_1438406863_walk-bike.png',
        'is_active' => 1,
        'ticket_ids' => '["13594"]',
        'position' => 0
    ]
];

$cod_id = 8885; // 当前登录用户ID

方案一:基础foreach循环(逻辑清晰,易调试)

核心逻辑是:用category_id作为结果数组的键,遍历原始数组时,优先保留用户条目,非用户条目仅在对应分类未被用户条目覆盖时才添加。

$finalCategories = [];

foreach ($originalCategories as $category) {
    $categoryKey = $category->category_id;
    
    // 如果是当前用户的条目,直接覆盖对应分类(优先级最高)
    if ($category->distributor_id === $cod_id) {
        $finalCategories[$categoryKey] = $category;
    } else {
        // 非用户条目:仅当该分类还未被处理时才添加
        if (!isset($finalCategories[$categoryKey])) {
            $finalCategories[$categoryKey] = $category;
        }
    }
}

// 可选:将关联数组转回索引数组(去掉category_id作为键)
$finalCategories = array_values($finalCategories);

// 输出结果
print_r($finalCategories);

方案二:利用数组键唯一性的简洁实现

利用PHP数组键的唯一性特性,先添加低优先级的全局条目,再添加高优先级的用户条目,用户条目会自动覆盖同category_id的全局条目:

$finalCategories = [];

// 第一步:先添加所有全局/非用户条目(低优先级)
foreach ($originalCategories as $category) {
    if ($category->distributor_id !== $cod_id) {
        $finalCategories[$category->category_id] = $category;
    }
}

// 第二步:添加用户条目(高优先级,自动覆盖同分类的全局条目)
foreach ($originalCategories as $category) {
    if ($category->distributor_id === $cod_id) {
        $finalCategories[$category->category_id] = $category;
    }
}

// 转回索引数组(可选)
$finalCategories = array_values($finalCategories);

print_r($finalCategories);

甚至可以简化为单次遍历的版本:

$finalCategories = [];
foreach ($originalCategories as $category) {
    $key = $category->category_id;
    // 用户条目直接覆盖,非用户条目仅在键不存在时添加
    if ($category->distributor_id === $cod_id || !isset($finalCategories[$key])) {
        $finalCategories[$key] = $category;
    }
}
$finalCategories = array_values($finalCategories);

最终效果说明

两种方案都会得到相同的结果:

  • category_id=5的条目保留distributor_id=8885的用户版本
  • category_id=6的条目保留distributor_id=999999的全局版本(因为没有对应的用户条目)

内容的提问来源于stack exchange,提问作者Shahzad Intersoft

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:27:31