PHP range() 函数
前言range()用来生成一个连续序列的数组是 PHP 里少数几个「天生就返回数组」的函数之一。正因为它看着简单很多人在用它的时候带着三个不准确的印象第一以为它只能生成数字。它同样能生成字符序列range(a, z)是常见的写法。但要注意两个边界都是字符串时生成的是字节序列——range(A, z)会顺带把[ \ ] ^ _这几个符号也包进来因为它们正好落在A和z的 ASCII 区间之间。第二以为负的步长能自动得到降序。PHP 8.3.0 起如果区间是递增的起点小于等于终点却给了负步长会直接抛ValueError。而在 PHP 8.2 及以前range()会去「猜」方向结果常常与预期相反。第三以为它像别的语言那样是左闭右开区间。PHP 的range()是闭区间结果里包含终点。本文按官方手册讲清range()的类型推导规则、PHP 8.3 引入的错误与警告、字符序列的坑以及大区间下的内存问题。一、签名与返回类型推导range(string|int|float $start, string|int|float $end, int|float $step 1): array返回的是数组但元素的类型取决于参数类型规则写在手册里条件结果两个边界都是字符串且$step是整数字节序列通常是 ASCII 字符$start、$end、$step中至少有一个是浮点数浮点数序列其余情况整数序列方向由边界决定$start小于等于$end时递增否则递减。步长$step只负责「每两个元素之间差多少」不负责决定方向。?php // 适用于 PHP 8.0echo implode(, , range(0, 5)), PHP_EOL; // 0, 1, 2, 3, 4, 5echo implode(, , range(5, 0)), PHP_EOL; // 5, 4, 3, 2, 1, 0echo implode(, , range(0, 100, 25)), PHP_EOL; // 0, 25, 50, 75, 100echo implode(, , range(c, a)), PHP_EOL; // c, b, a注意最后一个元素手册说明结果数组的最后一个元素要么是$end要么是它的前一个元素取决于步长。range(0, 10, 4)得到[0, 4, 8]——12超了终点所以停在8。二、PHP 8.3 引入的错误与警告PHP 8.3.0 对range()做了一次行为规范化这是使用它时必须知道的分界线情况PHP 8.3.0 起的行为$step为0抛ValueError$start、$end、$step中存在非有限值INF、-INF、NAN抛ValueError$step为负但区间是递增的$start $end抛ValueError$start或$end是空字符串发出E_WARNING空串按0处理$start或$end是多字节的非数字字符串发出E_WARNING一个边界是数字导致另一个字符串边界被隐式转成整数发出E_WARNING$step是浮点但小数部分为 0如2.0视为整数2结果数组是整数两个边界都是字符串一律生成字节序列旧版本里若一边是数字串另一边会被隐式转成整数也就是说range(1, 5, -1)在 PHP 8.2 上是能跑出结果的方向被「猜」成升序在 PHP 8.3 上会直接报错。升级到 PHP 8.3 时这类调用是最典型的兼容性炸弹应该在迁移前全局搜一遍。三、字符序列好看但危险range(a, z)很直观但它生成的其实是字节区间。ASCII 里大写字母、小写字母被若干符号隔开?php // 适用于 PHP 8.0$a range(a, z);$A range(A, Z);$all range(A, z);echo count($a), , count($A), , count($all), PHP_EOL;echo implode(, $all), PHP_EOL;26 26 58ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyzrange(A, z)得到的 58 个元素里中间的[、\、]、^、_、反引号并不是字母。需要「全部字母」时必须分两段再合并?php // 适用于 PHP 8.0$letters array_merge(range(A, Z), range(a, z));echo count($letters), PHP_EOL; // 52四、实战示例1. 用range()生成分页页码窗口?php // 适用于 PHP 8.0declare(strict_types1);/*** 生成当前页附近的页码窗口例如当前第 5 页、总 20 页、窗口 5 → 3,4,5,6,7** return listint*/function pageWindow(int $current, int $total, int $size 5): array{if ($total 1) {return [];}$half intdiv($size, 2);$start max(1, $current - $half);$end min($total, $start $size - 1);// 靠近尾页时向左补齐保证窗口宽度尽量等于 $size$start max(1, $end - $size 1);return range($start, $end); // 闭区间两端都包含}var_dump(pageWindow(1, 20)); // [1, 2, 3, 4, 5]var_dump(pageWindow(10, 20)); // [8, 9, 10, 11, 12]var_dump(pageWindow(20, 20)); // [16, 17, 18, 19, 20]2. 大区间不要用range()range()会一次性构造完整的数组。生成 1000 万个整数就要在内存里放 1000 万个元素如果还要对它们做array_map()中间还会再产生一份数组。需要惰性序列时用生成器generator?php // 适用于 PHP 8.0declare(strict_types1);/*** 与 range($start, $end, $step) 等价的惰性版本内存占用与区间长度无关。** return Generatorint, int*/function intRange(int $start, int $end, int $step 1): Generator{if ($step 0) {throw new ValueError(步长必须是正整数);}if ($start $end) {for ($i $start; $i $end; $i $step) {yield $i;}} else {for ($i $start; $i $end; $i - $step) {yield $i;}}}$sum 0;foreach (intRange(1, 1_000_000) as $n) {$sum $n;}echo $sum, PHP_EOL; // 500000500000这段代码的内存占用是恒定的无论区间多大。需要数组时再iterator_to_array()转换这样「是否真的需要全部元素」就成了一个显式决定。3. 生成时间点时注意浮点误差?php // 适用于 PHP 8.0// 用整数运算生成「每 15 分钟一个时间点」避开浮点累加误差$base strtotime(2024-01-01 00:00:00);$slots array_map(static fn (int $i): string date(Y-m-d H:i, $base $i * 900),range(0, 95) // 一天 96 个 15 分钟时段);echo $slots[0], ... , $slots[95], PHP_EOL;常见坑点❌range(1, 5, -1)想得到降序 —— PHP 8.3.0 起会抛ValueError递增区间配负步长PHP 8.2 及以前方向靠猜结果与预期相反。✅ 方向交给边界决定range(5, 1)就是降序真要用负步长写成range(5, 1, -1)。❌range(1, 10, 0)想「不按步长、逐个取」—— 旧版本里是死循环式的告警PHP 8.3.0 起抛ValueError。✅ 步长恒为正整数需要逐个取就省略第三个参数。❌ 用range(A, z)当「所有字母」—— 会带进[、\、]、^、_、反引号这 6 个非字母字符。✅array_merge(range(A, Z), range(a, z))。❌ 以为range()是左闭右开、不含终点 —— PHP 是闭区间range(1, 3)得到[1, 2, 3]。✅ 想要「从 0 开始的 N 个值」写range(0, $n - 1)用for ($i 0; $i $n; $i)时要记得这里才是开区间。❌ 用range()生成很大的区间再array_map()—— 数组先完整构造出来内存峰值随区间长度线性上升通常直接 OOM。✅ 用for循环或生成器惰性产生确实要数组时才调用iterator_to_array()。❌ 用浮点步长累加并期望精确值 ——range(0, 1, 0.1)的元素受二进制浮点表示影响末位可能不是0.1的精确倍数用来做等值比较会失败。✅ 需要精确小数时用整数运算先乘成整数再除比较用abs($a - $b) 1e-9或先round()。❌ 依赖range()的元素类型 ——range(1, 5, 2.0)在 PHP 8.3.0 起会返回整数数组浮点步长若没有小数部分会被当成整数在旧版本上可能是浮点。✅ 需要浮点结果时显式转换array_map(floatval, range(1, 5))。❌ 用range()生成数组键后忘了 PHP 的键类型规则 ——array_combine(range(1, 3), $values)得到的键是整数1, 2, 3不是字符串1,2,3PHP 数组会把纯数字字符串键自动转成整数。✅ 需要字符串键就显式转换array_map(strval, range(1, 3))或直接在键里加前缀。总结要点结论签名range(string\区间闭区间包含$end最后一个元素可能小于$end步长不整除时方向由$start与$end的大小决定不由步长的正负决定元素类型双字符串 整数步长 → 字节序列含浮点 → 浮点序列否则整数序列PHP 8.3.0 新增错误步长为 0、非有限值、递增区间配负步长均抛ValueError字符序列是按字节区间生成的range(A,z)会带进 6 个非字母字符内存一次性构造整个数组大区间应改用生成器或for循环一句话总结range()的方向由两个边界决定$step只控制间距记住它是闭区间、记住 PHP 8.3 起对非法步长不再「猜」而是抛ValueError再用生成器处理大区间它就是一个可靠的工具。

相关新闻

pytest实战:宏系统与PTZ云台控制的自动化测试

pytest实战:宏系统与PTZ云台控制的自动化测试

做软件这行的,早晚会碰上一个没法“手测”的项目。我印象最深的就是那套包含宏系统和 PTZ 云台控制的相机联动平台:宏命令能录能播,PTZ 控制有绝对定位、相对移动、连续调速、预置位,两者一叠加,输入组合瞬间变成几千种…

2026/10/9 13:42:02 阅读更多 →
2026年AI编程软件盘点:从代码补全到Agent的实战选型指南

2026年AI编程软件盘点:从代码补全到Agent的实战选型指南

2024年那波AI编程工具爆发的时候,市面上能打的还只有几个老面孔,到了2026年再抬头看,这个赛道已经卷成一片红海了。从单纯的代码补全,到能自己读Issue、改代码、跑测试的Agent,再到多智能体协作开发,工具形…

2026/10/8 9:45:08 阅读更多 →
WorkBuddy本质是MCP协议工作台,不是AI聊天框

WorkBuddy本质是MCP协议工作台,不是AI聊天框

1. WorkBuddy不是AI聊天框,而是你的“协议级工作台”很多人第一次点开WorkBuddy,下意识就把它当成另一个Claude或Cursor——输入指令、等它生成、复制粘贴。结果用了一周发现:响应慢、上下文总丢、插件装了不生效、本地文件读不出来……最后默…

2026/10/8 9:44:58 阅读更多 →

最新新闻

JavaEE教务系统实战:SqlServer+JSP教材征订闭环开发指南

JavaEE教务系统实战:SqlServer+JSP教材征订闭环开发指南

简介:本资源是一套基于JavaEE技术栈开发的高校教材征订全流程管理系统,面向计算机专业高年级学生、Web开发初学者及课程设计实践者,聚焦教学管理信息化场景,解决传统教材征订中流程冗长、信息不同步、人工统计易错等痛点。压缩包共…

2026/10/9 15:55:59 阅读更多 →
CHARLS数据清洗实战:跨期ID对齐、缺失码统一与面板构造

CHARLS数据清洗实战:跨期ID对齐、缺失码统一与面板构造

简介:本资源是CHARLS数据库系列教程第二部分的配套项目源码,面向健康经济学、社会学、人口统计学方向的研究者与数据分析学习者,重点解决该数据库清洗、拼接与整理流程复杂、缺乏成熟查对系统的问题。压缩包共8个文件,约12KB&…

2026/10/9 15:55:59 阅读更多 →
博物馆文物科普微信小程序开发实战:ThinkPHP与Laravel双框架后端方案

博物馆文物科普微信小程序开发实战:ThinkPHP与Laravel双框架后端方案

做博物馆文物科普知识普及系统微信小程序这活,听起来垂直,实际一上手就会发现,它既要照顾科普内容的表现力,又要把后端接口、小程序体验、地图导览、内容审核这些环节全串起来。我最近完整跑了一遍这个项目,后端用的是…

2026/10/9 15:55:59 阅读更多 →
朴素贝叶斯垃圾邮件拦截实战:原理、sklearn实现与工程化落地

朴素贝叶斯垃圾邮件拦截实战:原理、sklearn实现与工程化落地

简介:这是一份基于贝叶斯分类算法实现的垃圾邮件拦截软件项目,源自课程作业 strugglehw8,适合正在学习Python邮件处理、文本分类或桌面应用开发的读者参考。压缩包共61个文件,以Python源码、pyc编译文件、pkl数据文件以及界面图片…

2026/10/9 15:55:59 阅读更多 →
dnSpy-net472:旧版.NET Framework环境下反编译与调试C#程序集实战

dnSpy-net472:旧版.NET Framework环境下反编译与调试C#程序集实战

简介:dnSpy-net472 是一款面向 .NET/C# 开发者和逆向分析人员的免费开源工具,主要用于程序集反编译、动态调试和元数据编辑;在没有原始源代码的情况下,它能将 IL 中间语言还原为可读的 C# 代码,适用于软件逆向破解、第…

2026/10/9 15:55:59 阅读更多 →
SharpCompress 0.37.2 实战:多格式压缩解压与避坑指南

SharpCompress 0.37.2 实战:多格式压缩解压与避坑指南

简介:SharpCompress 0.37.2 是一份面向 .NET 开发者的压缩库 NuGet 离线包,适合需要在项目中集成 zip、rar、7z、tar 等格式读写能力的工程师,尤其适用于无法直接访问外网源、需手动引入依赖的内网或离线开发环境。压缩包共 11 个文件&#x…

2026/10/9 15:54:51 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →