php的range函数是内置的序列生成工具,能够根据给定的起始值、结束值和步长,生成包含连续元素的数组,支持数字、字符等多种类型的元素生成,在需要批量生成有序序列的场景中非常实用。

range函数基本语法
range函数的官方语法格式如下:
<?php /** * @param mixed $start 序列起始值 * @param mixed $end 序列结束值 * @param int|float $step 步长,默认值为1,必须为正数 * @return array 生成的序列数组 */ range($start, $end, $step = 1) ?>
函数会包含起始值和结束值,按照步长依次生成中间的元素,最终返回包含所有元素的数组。如果起始值大于结束值,生成的数组会按照从大到小的顺序排列。
生成连续数字数组
生成连续数字数组是range函数最基础的用法,默认步长为1时,会生成从起始数字到结束数字的连续整数数组。
<?php // 生成1到5的连续整数数组 $numArr = range(1, 5); print_r($numArr); // 输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) // 指定步长为2,生成1到10的偶数数组 $evenArr = range(1, 10, 2); print_r($evenArr); // 输出:Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 ) // 起始值大于结束值,生成倒序数组 $reverseArr = range(5, 1); print_r($reverseArr); // 输出:Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 ) ?>
生成指定步长的字符序列
range函数同样支持字符类型的起始和结束值,会按照字符的ASCII码顺序生成序列,步长同样可以自定义。
<?php
// 生成a到e的字符数组
$charArr = range('a', 'e');
print_r($charArr);
// 输出:Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )
// 生成大写字母A到Z的数组
$upperCharArr = range('A', 'Z');
echo count($upperCharArr); // 输出:26
// 指定步长为2,生成a到j的间隔字符数组
$stepCharArr = range('a', 'j', 2);
print_r($stepCharArr);
// 输出:Array ( [0] => a [1] => c [2] => e [3] => g [4] => i )
?>
需要注意字符序列的步长只能是整数,且字符的排序按照ASCII码规则,比如小写字母在大写字母之后,数字字符的ASCII码小于字母字符。
生成日期范围数组
range函数本身不支持直接的日期类型参数,但可以结合strtotime函数和date函数实现日期范围的生成,常见的是生成连续的日期字符串数组。
<?php
// 生成2024-01-01到2024-01-05的日期数组
$startDate = '2024-01-01';
$endDate = '2024-01-05';
// 将日期转为时间戳作为range的起始和结束值,步长为86400秒(1天)
$startTime = strtotime($startDate);
$endTime = strtotime($endDate);
$timeArr = range($startTime, $endTime, 86400);
// 将时间戳转为日期格式
$dateArr = array_map(function($timestamp) {
return date('Y-m-d', $timestamp);
}, $timeArr);
print_r($dateArr);
// 输出:Array ( [0] => 2024-01-01 [1] => 2024-01-02 [2] => 2024-01-03 [3] => 2024-01-04 [4] => 2024-01-05 )
?>
如果需要生成按小时、分钟间隔的日期范围,只需要调整步长参数即可,比如按小时生成的话步长设置为3600,按分钟生成的话步长设置为60。
使用注意事项
- 步长参数必须为正数,如果传入负数,函数会返回空数组。
- 当起始值和结束值类型不一致时,比如一个是数字一个是字符,php会尝试进行类型转换,可能导致不符合预期的生成结果,建议保持起始和结束值类型一致。
- 生成超大范围的序列时,会占用较多内存,比如生成1到1000000的数组,需要根据实际场景评估内存占用情况。
- 字符序列生成时,只支持单个字符作为起始和结束值,传入多字符字符串会取第一个字符作为序列依据。
常见场景示例
以下是range函数的两个常见实用场景:
<?php
// 场景1:生成分页页码数组,当前页前后各显示2页
$currentPage = 5;
$totalPage = 10;
$startPage = max(1, $currentPage - 2);
$endPage = min($totalPage, $currentPage + 2);
$pageArr = range($startPage, $endPage);
print_r($pageArr); // 输出:Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 6 [4] => 7 )
// 场景2:生成月份选项数组
$monthArr = range(1, 12);
$monthArr = array_map(function($month) {
return $month . '月';
}, $monthArr);
print_r($monthArr);
// 输出:Array ( [0] => 1月 [1] => 2月 [2] => 3月 [3] => 4月 [4] => 5月 [5] => 6月 [6] => 7月 [7] => 8月 [8] => 9月 [9] => 10月 [10] => 11月 [11] => 12月 )
?>