如何用变量简化Joomla多分类关联的PHP重复代码?
问题描述
数据库分类结构
Parent category A (category_id = 1) Child category B (category_id = 2) Child category C (category_id = 3) Child category D (category_id = 4) Child category E (category_id = 5)
背景
我使用的Joomla扩展不支持将一个页面同时归类到多个分类中,于是修改PHP文件,通过添加多个逗号分隔的category_id值实现了多分类功能,但代码过于冗长,所有数字位置的场景都需要手动编写。
现有代码
// 获取当前分类下的所有子分类ID $categoryModel = ES::model('ClusterCategory'); $childs = $categoryModel->getChildCategories($activeCategory->id, [], SOCIAL_TYPE_PAGE, array('state' => SOCIAL_STATE_PUBLISHED)); $childIds = []; foreach ($childs as $child) { $childIds[] = "1,$child->id"; $childIds[] = "2,$child->id"; $childIds[] = "3,$child->id"; $childIds[] = "4,$child->id"; $childIds[] = "5,$child->id"; $childIds[] = "$child->id,1"; $childIds[] = "$child->id,2"; $childIds[] = "$child->id,3"; $childIds[] = "$child->id,4"; $childIds[] = "$child->id,5"; $childIds[] = "1,$child->id,2"; $childIds[] = "2,$child->id,3"; $childIds[] = "3,$child->id,4"; $childIds[] = "4,$child->id,5"; $childIds[] = "5,$child->id,1"; $childIds[] = "2,$child->id,1"; $childIds[] = "3,$child->id,2"; $childIds[] = "4,$child->id,3"; $childIds[] = "5,$child->id,4"; $childIds[] = "1,$child->id,5"; $childIds[] = $child->id; }
需求
如何用变量替代代码中硬编码的数字?我尝试过正则表达式,希望实现类似$childIds[] = X,$child->id,X;这样的变量替换逻辑,简化重复代码。
解决方案
可以先把固定分类ID存入数组,再通过循环生成所有需要的组合,彻底避免硬编码。优化后的代码如下:
// 获取当前分类下的所有子分类ID $categoryModel = ES::model('ClusterCategory'); $childs = $categoryModel->getChildCategories($activeCategory->id, [], SOCIAL_TYPE_PAGE, array('state' => SOCIAL_STATE_PUBLISHED)); $childIds = []; // 定义固定分类ID数组,所有硬编码数字统一维护在这里 $fixedCategoryIds = [1, 2, 3, 4, 5]; foreach ($childs as $child) { $currentChildId = $child->id; // 添加单个子分类ID $childIds[] = $currentChildId; // 生成双ID组合:固定ID+子ID、子ID+固定ID foreach ($fixedCategoryIds as $fixedId) { $childIds[] = "$fixedId,$currentChildId"; $childIds[] = "$currentChildId,$fixedId"; } // 生成三ID组合:固定ID+子ID+下一个固定ID、固定ID+子ID+上一个固定ID $totalFixedIds = count($fixedCategoryIds); foreach ($fixedCategoryIds as $index => $fixedId) { // 循环获取下一个固定ID(最后一个的下一个是第一个) $nextFixedId = $fixedCategoryIds[($index + 1) % $totalFixedIds]; $childIds[] = "$fixedId,$currentChildId,$nextFixedId"; // 循环获取上一个固定ID(第一个的上一个是最后一个) $prevFixedId = $fixedCategoryIds[($index - 1 + $totalFixedIds) % $totalFixedIds]; $childIds[] = "$fixedId,$currentChildId,$prevFixedId"; } }
代码说明
- 统一维护固定分类ID:把所有硬编码的分类ID放到
$fixedCategoryIds数组中,后续修改分类ID只需调整这个数组,无需改动循环逻辑。 - 单个子ID处理:直接添加当前子分类ID,与原代码最后一行逻辑一致。
- 双ID组合生成:通过循环固定分类数组,自动生成
固定ID,子ID和子ID,固定ID两种格式,覆盖原代码前10行的重复代码。 - 三ID组合生成:循环时通过索引取模计算当前固定ID的上一个和下一个ID(实现循环衔接),自动生成两种三ID组合,覆盖原代码中间20行的重复代码。
修改后代码的可维护性大幅提升,新增或调整分类ID时,仅需修改$fixedCategoryIds数组即可。
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

