PHP的range()非懒加载且内存占用大,参数方向与步长需严格匹配,字符范围限单字节ASCII,浮点数致全数组转float,8.3版加强E_WARNING警告边界输入。

range() 会直接生成一个完整数组,不是迭代器,也不是懒加载——这意味着你传入 range(1, 1000000) 就真会分配一百万个整数的内存。别把它当 Python 的 range 用。
range 参数顺序和方向容易反着写
range() 不要求 $start 必须小于 $end,但方向由大小关系决定:
• 如果 $start ,生成递增序列(如 <code>range(5, 1) 实际生成的是 [5,4,3,2,1])
• 如果 $start > $end,且没给 $step,默认步长仍是 1,但这时会报 ValueError:因为 PHP 要求递减时 $step 显式为负数
• 正确写法是 range(5, 1, -1),否则 PHP 8.0+ 直接抛异常
• 字符场景同理:range('z', 'a') 会警告并可能出错,必须写成 range('z', 'a', -1)
立即学习“PHP免费学习笔记(深入)”;
字符范围只支持单字节 ASCII,且 step 必须是 int
range() 对字符串的支持非常有限:
• 只接受长度为 1 的字符串,比如 'a'、'Z',不支持 'α'、'あ' 或 'ab'
• $step 必须是整数;传 1.0 或 intval(1) 都行,但 1.5 会触发 E_WARNING 并降级为 1
• PHP 8.3 开始,如果 $start 或 $end 是多字节非数字字符串(如中文),会明确发出 E_WARNING
• 示例:range('A', 'C') → ['A','B','C'];range('A', 'C', 2) → ['A','C']
浮点数参数会让整个数组变成 float 类型
哪怕只传一个浮点数,返回数组里所有元素都会是float:
• range(1.0, 5) 返回 [1.0, 2.0, 3.0, 4.0, 5.0],不是 int
• range(1, 5.0) 同样全为 float
• range(1.5, 4.5, 1.0) 是合法的,但结果是 [1.5, 2.5, 3.5] —— 注意不会包含 4.5,因为 3.5 + 1.0 == 4.5 才刚好卡进边界,PHP 判定“≤ end”才收录
• step = 0 会立即抛 ValueError,连执行都不让
想生成随机不重复数?range 只是第一步
range() 本身不随机,只是造好池子:
• 先用 range(1, 50) 建数组
• 再用 shuffle() 打乱(注意它修改原数组)
• 最后 array_slice($arr, 0, 6) 取前 N 个
• 别用 mt_rand() 循环去重,大数据量下性能差、逻辑易错
• 如果要避免内存占用,得换方案:比如用 random_int() + array_key_exists() 检查,或改用数据库 ORDER BY RAND() LIMIT N
range() 在 8.3 版本加强了类型警告,空字符串、多字节字符、隐式数字转换都会发 E_WARNING——这些在旧代码里可能静默运行,升级后突然报错。别只测正常路径,得专门试 range('', 'z')、range('测试', 'z') 这类边界输入。



















