如何避免大量IF语句,实现炉石卡组自动生成子类型?
炉石卡组构建器自动生成子类型的实现方案
需求回顾
当卡组内某种族卡牌数量≥6张时,该种族成为卡组子类型;支持多个子类型,最终以小写逗号分隔字符串(如demon,pirate)存入SQL的subtype列,且用户后续可自行修改。
现有代码基础
你已经通过数组统计出了各种族的卡牌数量:
// 遍历卡组收集种族 $subtype = array(); if(!empty($card['race'])) { array_push($subtype,$card['race']); } // 统计数量 sort($subtype); $count = array_count_values($subtype);
得到的统计结果示例:
Array ( [Demon] => 6 [Murloc] => 4 [Pirate] => 8 )
筛选并拼接符合条件的子类型
只需在统计完成后,通过以下代码筛选出数量≥6的种族并拼接成目标字符串:
// 筛选数量≥6的种族(保留键值对) $qualifiedRaces = array_filter($count, function($cardNum) { return $cardNum >= 6; }); // 提取种族名称(数组的键) $raceNames = array_keys($qualifiedRaces); // 拼接成小写逗号分隔的字符串 $finalSubtype = strtolower(implode(',', $raceNames));
执行后$finalSubtype的值为demon,pirate,可直接存入SQL。
性能优化建议
如果卡组卡牌数量较多,可以直接在遍历阶段完成计数,避免先收集所有种族再统计的额外开销:
$raceCount = []; foreach ($deckCards as $card) { if (!empty($card['race'])) { $race = $card['race']; // 直接累加计数 $raceCount[$race] = isset($raceCount[$race]) ? $raceCount[$race] + 1 : 1; } } // 后续筛选拼接逻辑和上述一致 $qualifiedRaces = array_filter($raceCount, fn($num) => $num >= 6); $finalSubtype = strtolower(implode(',', array_keys($qualifiedRaces)));
内容的提问来源于stack exchange,提问作者Phoenixy
相关产品推荐
相关产品推荐

