
本文介绍一种不依赖内置函数(如 range)、纯数学逻辑驱动的 for 循环方案,根据最大页数和当前索引,精准输出包含“前一项 + 当前项 + 后两项”共 4 个数字的序列,并自动适配首尾边界(如当前为 1 或末位时自动收缩显示范围)。
要实现“显示当前项、其前一项及后两项(共最多 4 个连续数字)”,同时严格满足边界约束(最小为 1,最大不超过 $pager_max),关键在于动态计算循环起始与终止位置,而非硬编码条件判断。原始代码中使用 ($current - $pager_max) + 6 等表达式缺乏可读性且逻辑错误,正确思路是:
- 理想区间:以 $current 为中心,期望显示 [$current-1, $current, $current+1, $current+2](共 4 个数);
- 左边界修正:若 $current == 1,则无法取前一项,起始必须为 1;
- 右边界修正:若 $current + 2 > $pager_max,则需将整个窗口向左平移,使末位恰好为 $pager_max,即起始应为 $pager_max - 3;
-
通用公式:
- 起始值 start = max(1, min($current - 1, $pager_max - 3))
- 终止值 end = min($pager_max, max($current + 2, 4))
但注意:由于题目明确要求仅用 for 循环 + 公式,禁用函数(如 range, max, min),我们必须将边界逻辑内联到循环条件中。
✅ 正确解法(纯 for 循环,无函数调用):
$pager_max) ? $pager_max - 3 : $current - 1);
$end = ($current == 1) ? 4 : (($current + 2 > $pager_max) ? $pager_max : $current + 2);
// 确保 start 不小于 1,end 不大于 pager_max(双重兜底)
$start = ($start < 1) ? 1 : $start;
$end = ($end > $pager_max) ? $pager_max : $end;
for ($i = $start; $i <= $end; $i++) {
// 高亮当前项
$output = ($i == $current) ? "**{$i}**" : $i;
echo $output . '
';
}
?>? 运行效果验证($pager_max = 8):
- $current = 1 → 显示 **1**, 2, 3, 4
- $current = 3 → 显示 2, **3**, 4, 5
- $current = 8 → 显示 5, 6, 7, **8**
? 关键说明:
立即学习“PHP免费学习笔记(深入)”;
- 所有逻辑均基于四则运算与三元运算符,完全规避 range()、array_*、max() 等函数,符合题目“仅用公式”的硬性要求;
- $start 和 $end 的推导本质是解不等式组:i ≥ current−1, i ≤ current+2, i ≥ 1, i ≤ pager_max,取交集后得到闭区间;
- 若 $pager_max
- 高亮格式 **X** 可按需替换为 HTML 或 CSS 类,不影响核心算法。
总结:边界感知的邻域提取,核心不在循环本身,而在于用代数方式严谨求解有效索引区间。掌握 start = max(1, current−1, pager_max−3) 的等价三元展开,即可在任何无函数环境中稳健复现此逻辑。











