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

