应使用嵌套三元运算符并加括号确保优先级,如$points = ($streak >= 8) ? 50 : ($streak >= 4) ? 20 : 10;需先清洗输入:$streak = max(0, (int)($user['streak_days'] ?? 0))。

根据用户连续签到天数快速计算本次应得积分,避免写满屏if-else判断连续1–3天、4–7天、8天及以上三档阶梯分值,就得用对三元运算符的嵌套层级与括号包裹逻辑。
基础三档积分计算(推荐用于≤3级判断)
第一步:确认变量$streak已赋值且为整数类型,例如从数据库读取的连续签到天数。
第二步:直接使用单行嵌套三元表达式计算积分:【$points = ($streak >= 8) ? 50 : ($streak >= 4) ? 20 : 10;】
这一步操作起来很简单,但如果你漏掉内层括号写成$streak >= 8 ? 50 : $streak >= 4 ? 20 : 10,PHP会按左结合解析,导致$streak为5时误判为20分——这不是bug,是运算符优先级规则。
带兜底与边界修正的健壮写法
方法一:用空合并运算符??前置清理无效输入
$streak = $user['streak_days'] ?? 0;
方法二:强制转整并限制最小值,防止负数或字符串干扰
$streak = max(0, (int)$streak);
方法三:整合进三元表达式,一行完成清洗+判断
$points = (($streak = max(0, (int)($user['streak_days'] ?? 0))) >= 8) ? 50 : ($streak >= 4) ? 20 : 10;
四档积分+额外奖励的链式扩展
当需要支持「连续15天加赠10分」这类叠加规则时,必须拆解为两步:
① 先算基础分:【$base = ($streak >= 15) ? 80 : ($streak >= 8) ? 50 : ($streak >= 4) ? 20 : 10;】
② 再叠加奖励:【$bonus = ($streak >= 15) ? 10 : 0;】
$points = $base + $bonus;
注意:不要试图把加法塞进三元分支里,比如($streak >= 15) ? 80 + 10 : ...,这样会让后续维护者无法单独复用基础分逻辑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











