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

如何避免大量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:13:24