range

(PHP 4, PHP 5, PHP 7, PHP 8)

range创建包含一系列元素的数组

描述

range(string|int|float $start, string|int|float $end, int|float $step = 1): array

创建包含一系列元素的数组。

如果 startend 都是 string,并且 stepint,则生成的数组将是一系列字节。否则,生成的数组将是一系列数字。

如果 start 小于等于 end,则序列递增。否则,序列递减。

参数

start

序列的第一个值。

end

序列的最后一个可能值。

step

step 指示序列的每个值之间序列的步进量。

step 对于递减序列可以为负数。

如果 step 是一个没有小数部分的 float,则将其解释为 int

返回值

返回一个 array 形式的元素序列,第一个元素为 start,一直到 end,序列的每个值相差 step 个值。

返回数组的最后一个元素要么是 end,要么是序列的前一个元素,具体取决于 step 的值。

如果 startend 都是 string,并且 stepint,则生成的数组将是一系列字节,通常是拉丁 ASCII 字符。

如果 startendstep 中至少有一个是 float,则生成的数组将是一系列 float

否则,生成的数组将是一系列 int

错误/异常

  • 如果 step0,则会抛出 ValueError
  • 如果 startendstep 不是 is_finite(),则会抛出 ValueError
  • 如果 step 为负数,但生成的范围递增(即 $start <= $end),则会抛出 ValueError
  • 如果 startend 是空字符串 '',则会发出 E_WARNING,并且空字符串将被解释为 0
  • 如果 startend 是一个非 数字字符串,并且包含多个字节,则会发出 E_WARNING
  • 如果 startend 是一个字符串,因为另一个边界值为数字而被隐式转换为 int,则会发出 E_WARNING
  • 如果 step 是一个 float,并且 startend 是非 数字字符串,则会发出 E_WARNING

变更日志

版本 描述
8.3.0 如果 startend 都是字符串,那么 range() 现在将始终生成一个 array 字节。以前,如果其中一个边界值是数字字符串,则另一个边界值将被隐式转换为 int
8.3.0 如果 startend 是一个字符串,因为另一个边界值为数字而被隐式转换为 int,则会发出 E_WARNING
8.3.0 如果 startend 是一个包含多个字节的非数字字符串,则会发出 E_WARNING
8.3.0 如果 startend 是空字符串,则会发出 E_WARNING
8.3.0 如果 step 是一个没有小数部分的 float,则将其解释为 int
8.3.0 如果在生成递增范围时 step 为负数,则会抛出 ValueError
8.3.0 如果 step 不是有限的,则会抛出 ValueError
8.3.0 如果 startend 是一个 arrayobjectresource,则会抛出 TypeError。以前它们会被隐式转换为 int

示例

示例 #1 range() 示例

<?php
echo implode(', ', range(0, 12)), PHP_EOL;

echo
implode(', ', range(0, 100, 10)), PHP_EOL;

echo
implode(', ', range('a', 'i')), PHP_EOL;

echo
implode(', ', range('c', 'a')), PHP_EOL;

echo
implode(', ', range('A', 'z')), PHP_EOL;
?>

上面的示例将输出

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
a, b, c, d, e, f, g, h, i
c, b, a
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, [, \, ], ^, _, `, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z

参见

添加笔记

用户贡献的笔记 30 笔

Palz
11 年前
要创建像这样的范围数组

数组
(
[11] => 1
[12] => 2
[13] => 3
[14] => 4
)

使用 array_combine 合并两个范围数组

array_combine(range(11,14),range(1,4))
gtisza at gmail dot com
11 年前
您可能期望 range($n, $n-1) 为空数组(例如在 Python 中),但实际上 PHP 会假设步长为 -1 如果开始大于结束。
php at keith tyler dot com
10 年前
因此,随着 range() 函数中引入单字符范围,内部函数试图变得“智能”,并且(我从这里推断出的行为)显然检查了传入值的类型。如果一个是数字,包括数字字符串,那么另一个被视为数字;如果它是非数字字符串,则被视为零。

但是。

如果以强制其被识别为字符串类型而非数字类型的方式传入数字字符串,则 range() 的功能将大不相同。

比较

<?php
echo implode("",range(9,"Q"));
// 输出 9876543210

echo implode("",range("9 ","Q")); // 9 后面的空格
// 输出 9:;<=>?@ABCDEFGHIJKLMNOPQ

echo implode("",range("q","9 "));
// 输出 qponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654
?>

我不会称之为错误,因为在我看来,它甚至比该函数的默认用法更有用。
Alien426
8 年前
即使您的数字参数用引号括起来,该函数也会生成一个整数数组。
<?php
var_dump
( range('1', '2') ); // 输出 array(2) { [0]=> int(1) [1]=> int(2) }
?>

获取字符串数组的简单方法是将 strval() 映射到范围
<?php
var_dump
( array_map('strval', range('1', '2')) ); // 输出 array(2) { [0]=> string(1) "1" [1]=> string(1) "2" }
?>
ccb_bc at hotmail dot com
5 年前
<?php
function natural_prime_numbers(array $range, bool $print_info = false) : array {
$start_time = time();
$primes_numbers = array();
$print = '';
$count_range = count($range);
foreach(
$range as $number){
$values_division_number = array();
if(
$number === 0 || $number === 1 || !is_int($number)){ // 消除 0, 1 和其他非整数
continue;
}
if(
$number != 2 && $number%2 === 0){ // 消除 2 和偶数
continue;
}
for(
$i = 1; $i <= $number; $i++){
$resultado_divisao = $number / $i;
$values_division_number[$i] = $resultado_divisao;

if(
$count_range <= 20){ // $count_range <= 20 (+ 性能)
$print .= PHP_EOL;
$info = '数字 '.$number.' 除以数字 '.$i.' 等于: '.($number / $i);
$print .= $info;
if(
$i === $number){
$print .= PHP_EOL;
}
}

array_walk($values_division_number, function($value, $index) use (&$values_division_number, &$number){ // 引用更改值
// 消除浮点数和其他不等于 1 和自身数字的数字
if(is_float($value) && $value != $number && $value > 1){
unset(
$values_division_number[$index]);
}
});

$values_division_number = array_values($values_division_number); // 重新索引数组

// 这里我们只想要具有 2 个索引的数组,其值为 1 和自身数字(自然素数的规则)
if(count($values_division_number) === 2 && $values_division_number[0] === $number && $values_division_number[1] === 1){
$primes_numbers[$number] = $number;
}

}
}
return array(
'length_prime_numbers' => count($primes_numbers),
'prime_numbers' => array_values($primes_numbers),
'print' => $print,
'total_time_processing' => (time() - $start_time).' seconds.',
);
}
var_dump(natural_prime_numbers(range(0, 11))); // 这里使用了 range() 函数 ;-)

// 结果:
// array (size=3)
// 'length_prime_numbers' => int 5
// 'prime_numbers' =>
// array (size=5)
// 0 => int 2
// 1 => int 3
// 2 => int 5
// 3 => int 7
// 4 => int 11
// 'print' => string '
// 数字 2 除以数字 1 等于: 2
// 数字 2 除以数字 2 等于: 1

// 数字 3 除以数字 1 等于: 3
// 数字 3 除以数字 2 等于: 1.5
// 数字 3 除以数字 3 等于: 1

// 数字 5 除以数字 1 等于: 5
// 数字 5 除以数字 2 等于: 2.5
// 数字 5 除以数字 3 等于: 1.6666666666667
// 数字 5 除以数字 4 等于: 1.25
// 数字 5 除以 '...

// **************************** //
//
// * 请记住,该函数是递归的,也就是说:5000 的范围在 Intel® Core™ i5-8250U (3.40 GHz) 处理器上需要超过 1 分钟。
//
// **************************** //
?>
luca.favorido ATgmailDOT com
8 年前
"range" 函数非常有用,可以获取字符数组,如 range('C','R') 所示。

在工作中,我不得不扩展 range($a,$b) 函数以在此特殊情况下工作:对于两个大写字符串 $a 和 $b,它应该返回 $a 和 $b 之间的可能字符串。
例如,这可以用于获取 Excel 列索引。
例如,<?php range('A','AD') ==> array('A','B','C',...,'Z','AA','AB','AC','AD') ?>

因此,我编写了函数 getrange($min,$max),它正好能做到这一点。

<?php

function getcolumnrange($min,$max){
$pointer=strtoupper($min);
$output=array();
while(
positionalcomparison($pointer,strtoupper($max))<=0){
array_push($output,$pointer);
$pointer++;
}
return
$output;
}

function
positionalcomparison($a,$b){
$a1=stringtointvalue($a); $b1=stringtointvalue($b);
if(
$a1>$b1)return 1;
else if(
$a1<$b1)return -1;
else return
0;
}

/*
* e.g. A=1 - B=2 - Z=26 - AA=27 - CZ=104 - DA=105 - ZZ=702 - AAA=703
*/
function stringtointvalue($str){
$amount=0;
$strarra=array_reverse(str_split($str));

for(
$i=0;$i<strlen($str);$i++){
$amount+=(ord($strarra[$i])-64)*pow(26,$i);
}
return
$amount;
}
?>
ThinkMedical at Gmail dot com
15 年前
在其他语言(如 Python)中,range() 非常高效,但在 PHP 中(与 for 循环相比)则不然。 *

PHP 是一种受 C 语言启发的语言,因此使用 for 循环完全符合语言的审美观。

<?php
// 高效
for($i = $start; $i < $end; $i+=$step)
{
// 对数组做一些操作
}

// 低效
foreach(range($start, $end, $step) as $i)
{
// 对数组做一些操作
}
?>

官方文档没有提到 for 循环,这很奇怪。

但是请注意,在 PHP5 中,当不递增变量时,foreach 比 for 循环更快。

* 我使用 microtime 和 100,000 次迭代进行的测试(大约 10 次)一致地表明,for 循环比 foreach(range()) 快 4 倍。 *
jazzduck AT gmail DOT com
10 年前
尽管上面一行说 $step 值应该“作为正数给出”,但 range() 函数实际上可以正确处理反向(递减)范围。例如

<?php print_r( range( 24, 20 ) ); ?>
数组
(
[0] => 24
[1] => 23
[2] => 22
[3] => 21
[4] => 20
)

<?php print_r( range( 20, 11, -3 ) ); ?>
数组
(
[0] => 20
[1] => 17
[2] => 14
[3] => 11
)

它实际上会忽略 $step 参数的符号,并根据 $start > $end 或 $end > $start 纯粹地确定是递增还是递减。例如

<?php print_r( range( 20, 11, 3 ) ); ?>
数组
(
[0] => 20
[1] => 17
[2] => 14
[3] => 11
)

<?php print_r( range( 11, 20, -3 ) ); ?>
数组
(
[0] => 11
[1] => 14
[2] => 17
[3] => 20
)
ktamas77 at gmail dot com
12 年前
如果你需要零填充、字符串前缀或任何其他掩码,那么 array_map、内联函数和 sprintf 的简单组合就是你的朋友。

<?php

$a
= array_map(function($n) { return sprintf('sample_%03d', $n); }, range(50, 59) );

print_r($a);

?>

结果

数组
(
[0] => sample_050
[1] => sample_051
[2] => sample_052
[3] => sample_053
[4] => sample_054
[5] => sample_055
[6] => sample_056
[7] => sample_057
[8] => sample_058
[9] => sample_059
)
chris at laflash dot org
17 年前
使用最小和最大年份集快速创建 HTML 菜单

<?php
/*
** 使用最小和最大年份集快速创建 HTML 菜单。
** @author Chris Charlton <[email protected]>
** @license FREE!
*/

// 年份范围设置
$year_built_min = 1900;
$year_built_max = date("Y");
?>
<select id="yearBuiltMin" size="1">
<?php // 生成最小年份

foreach (range($year_built_min, $year_built_max) as $year) { ?>
<option value="<?php echo($year); ?>"><?php echo($year); ?></option>
<?php } ?>
</select>

<select id="yearBuiltMax" size="1">
<?php // 生成最大年份

foreach (range($year_built_max, $year_built_min) as $year) { ?>
<option value="<?php echo($year); ?>"><?php echo($year); ?></option>
<?php } ?>
</select>
m0sh3 at hotmail dot com
17 年前
以下是我如何使用它来检查数组是否为关联数组

<?php

if (array_keys($arr)===range(0, sizeof($arr)-1)) {
// 非关联数组

} else {
// 关联数组

}

?>
Ray.Paseur often uses Gmail
11 年前
有趣的是,这两个语句生成了相同的 26 个字符的字母数组。

<?php
$arr
= range('A', 'Z');
$arr = range('AA', 'ZZ');
dries at volta dot be
12 年前
你是否曾经想过要生成一个包含用于解析 Excel 文件的列名范围的数组?
我写了一个函数,从 A 列开始,并添加列名直到你指定的列。

<?php

/**
* 此函数创建一个数组,包含从第一个字母到指定字母之前的所有列名。
*/
function createColumnsArray($end_column, $first_letters = '')
{
$columns = array();
$length = strlen($end_column);
$letters = range('A', 'Z');

// 遍历26个字母。
foreach ($letters as $letter) {
// 在下一个字母前粘贴 $first_letters。
$column = $first_letters . $letter;

// 将列添加到最终数组中。
$columns[] = $column;

// 如果添加的是结束列,则返回所有列。
if ($column == $end_column)
return
$columns;
}

// 添加列子节点。
foreach ($columns as $column) {
// 如果在之前的迭代中已经设置了 $end_column,则不进行迭代。
// 如果已经达到最大字符长度,则停止迭代。
if (!in_array($end_column, $columns) && strlen($column) < $length) {
$new_columns = createColumnsArray($end_column, $column);
// 将新创建的列与最终列数组合并。
$columns = array_merge($columns, $new_columns);
}
}

return
$columns;
}

?>

用法

<?php

// 返回从 A 到 BI 的所有列名的数组。
createColumnsArray('BI');

?>
me at phpscott dot com
12 年前
因此,我需要一个快速简便的方法来创建一个下拉选择菜单,用于显示小时、分钟和秒,并使用两位数字格式,为了创建这些数据数组,我将 range 与 array_merge 结合在一起。.

<?php
$prepend
= array('00','01','02','03','04','05','06','07','08','09');
$hours = array_merge($prepend,range(10, 23));
$minutes = array_merge($prepend,range(10, 59));
$seconds = $minutes;
?>

非常简单。
captvanhalen at gmail dot com
16 年前
这里有一个自制的 range() 函数,它使用 step 功能,适用于那些无法使用 PHP5 的不幸用户。

<?php
function my_range( $start, $end, $step = 1) {

$range = array();

foreach (
range( $start, $end ) as $index) {

if (! ((
$index - $start) % $step) ) {
$range[] = $index;
}
}

return
$range;
}
?>
moficer at host dot sk
8 年前
php 5.6.16

<?php
var_export
(range('Z', 'a'));

/*
array (
0 => 'Z',
1 => '[',
2 => '\\',
3 => ']',
4 => '^',
5 => '_',
6 => '`',
7 => 'a',
)
*/
jay at NOspam dot myd3 dot com
15 年前
这是 thomas 的 range_string() 函数的修改版本。它更简单、更清晰、更健壮,但它缺少该函数的进阶功能,希望它对某人有所帮助。

示例

输入: "1, 2, 3, 4, 5, 6" --> 输出: 1, 2, 3, 4, 5, 6
输入: "1-6" --> 输出: 1, 2, 3, 4, 5, 6
输入: "1-6" --> 输出: 1, 2, 3, 4, 5, 6
输入: "1 - -6" --> 输出: 1, 2, 3, 4, 5, 6
输入: "0 - 0" --> 输出: 0
输入: "1, 4-6, 2" --> 输出: 1, 2, 4, 5, 6
输入: "6,3-1" --> 输出: 1, 2, 3, 6

<?php

define
('RANGE_ARRAY_SORT', 1);
define('RANGE_ARRAY', 2);
define('RANGE_STRING_SORT', 3);
define('RANGE_STRING', 4);

function
range_string($range_str, $output_type = RANGE_ARRAY_SORT)
{
// 移除空格和其他不必要的字符
$find[] = "/[^\d,\-]/";
$replace[] = "";

// 移除重复的连字符
$find[] = "/\-+/";
$replace[] = "-";

// 移除重复的逗号
$find[] = "/\,+/";
$replace[] = ",";

$range_str = preg_replace($find, $replace, $range_str);

// 移除字符串末尾的逗号或连字符
$range_str = trim($range_str,",-");

$range_out = array();
$ranges = explode(",", $range_str);

foreach(
$ranges as $range)
{

if(
is_numeric($range) || strlen($range) == 1)
{
// 只是一个数字;将其添加到列表中。
$range_out[] = (int) $range;
}
else if(
is_string($range))
{

// 可能是一系列值。
$range_exp = preg_split("/(\D)/",$range,-1,PREG_SPLIT_DELIM_CAPTURE);

$start = $range_exp[0];
$end = $range_exp[2];

if(
$start > $end)
{
for(
$i = $start; $i >= $end; $i -= 1)
{
$range_out[] = (int) $i;
}
}
else
{
for(
$i = $start; $i <= $end; $i += 1)
{
$range_out[] = (int) $i;
}
}

}
}

switch (
$output_type) {
case
RANGE_ARRAY_SORT:
$range_out = array_unique($range_out);
sort($range_out);

case
RANGE_ARRAY:
return
$range_out;
break;

case
RANGE_STRING_SORT:
$range_out = array_unique($range_out);
sort($range_out);

case
RANGE_STRING:

default:
return
implode(", ", $range_out);
break;
}
}

// 示例用法:
$range = range_string("6, 3-1");

?>
krdr dot mft at gmail dot com
10 年前
我最近才接触到 range() 函数,发现关于它的示例有些错误,甚至效率低下。

<?php
$o
= "";
$time_start = microtime(true);
foreach(
range(1, 10000) as $val) {
$o .= $val;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo
'rangein: '.$time.'<br />';

$o = "";
$time_start = microtime(true);
$a = range(1, 10000);
foreach(
$a as $val) {
$o .= $val;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo
'rangeout: '.$time.'<br />';

?>

结果

rangein: 0.0025348663330078
rangeout: 0.0019199848175049

在某些情况下,差异甚至更大,并且与生成的范围成比例。我认为 range() 的结果被缓存/哈希。

注意:执行顺序会影响执行时间,但差异仍然存在
qz
8 年前
如果你想填充一个数组以获取一个包含 0-9 数字值的哈希表,使用
range(0,9);
是一个比
array_fill(0, 10, '');
manuel at levante dot de
17 年前
<?php
function srange ($s) {
preg_match_all("/([0-9]{1,2})-?([0-9]{0,2}) ?,?;?/", $s, $a);
$n = array ();
foreach (
$a[1] as $k => $v) {
$n = array_merge ($n, range ($v, (empty($a[2][$k])?$v:$a[2][$k])));
}
return (
$n);
}

$s = '1-4 6-7 9-10';
print_r(srange($s));
?>

返回值
数组
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 6
[5] => 7
[6] => 9
[7] => 10
)
VivienG
10 个月前
他们忘了说些什么。
如果结束值没有遇到最后一个序列,则该函数返回 false。
换句话说
给定一个整数 $n,如果 ( $start + $n * $step ) < $end 并且 ( $start + ( $n + 1 ) * $step ) > $end,则该函数不会给出最大的可能范围,而是返回一个布尔值。
因此最后一个范围数字必须是结束数字。
mohammed dot hussein dot mahmoud at gmail dot com
2 年前
你可以使用负数代替 `step` 参数。你需要确保 `start` 大于 `end`。注意 php 中的 range() 函数生成包含范围,即它也包含 `end` 参数,而不仅仅是直到它但不包含它,就像大多数其他语言一样。
以下代码片段应该解释我对负步长是什么意思

<?php

// 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0
print_r(range(100, 0, -10));

?>

基本上发生的是 range 函数并不真正关心哪个更大或更小,它只是将步长添加到起点,并将该值追加到一个临时结果变量,只要它没有达到结束参数值。在这种情况下,添加负数就像减法(计算机在幕后对 2 的补码执行此操作)。这将导致数字从 100 变为 90,然后该函数将检查 90 是否已达到 0。由于它还没有完成,它将继续将 -step(在本例中为 -10)添加到最新结果(即 90)中,依此类推。

由于 range() 据说比 array_fill() 更好更快,我认为我尝试一下并在官方文档中发布此注释非常重要,以确保人们可以使用它。
lsblsb at gmx dot de
10 年前
我需要一个函数,它可以创建具有任意长度的字母范围。
你可以通过 $length 参数指定你需要多少个条目。
逻辑类似于计算表中列标题的逻辑。

<?php

/**
* 创建具有任意长度的字母范围
* @param int $length
* @return array
*/
function createLetterRange($length)
{
$range = array();
$letters = range('A', 'Z');
for(
$i=0; $i<$length; $i++)
{
$position = $i*26;
foreach(
$letters as $ii => $letter)
{
$position++;
if(
$position <= $length)
$range[] = ($position > 26 ? $range[$i-1] : '').$letter;
}
}
return
$range;
}
?>
derek at php dot net
19 年前
这应该更好地模拟 range()。
<?php
function range_wroar($low, $high, $step = 1) {
$arr = array();
$step = (abs($step)>0)?abs($step):1;
$sign = ($low<=$high)?1:-1;
if(
is_numeric($low) && is_numeric($high)) {
// 数字序列
for ($i = (float)$low; $i*$sign <= $high*$sign; $i += $step*$sign)
$arr[] = $i;
} else {
// 字符序列
if (is_numeric($low))
return
$this->range($low, 0, $step);
if (
is_numeric($high))
return
$this->range(0, $high, $step);
$low = ord($low);
$high = ord($high);
for (
$i = $low; $i*$sign <= $high*$sign; $i += $step*$sign) {

$arr[] = chr($i);
}
}
return
$arr;
}
?>
pyetrosafe at gmail dot com
10 年前
要创建具有定义大小和空值的简单数组或多维数组,请使用以下表达式

<?php

$SimpleArray
= array_map(function($n) { return null; }, range(1, 3) );
$MultiArray = array_map(function($n) { return array_map(function($n) { return null; }, range(1, 2) ); }, range(1, 3) );

var_dump($SimpleArray);
var_dump($MultiArray);

// 并输出:
?>
>>$SimpleArray
array(3) {
[0]=> NULL
[1]=> NULL
[2]=> NULL
}

>>$MultiArray
array(3) {
[0]=> array(2) {
[0]=> NULL
[1]=> NULL
}
[1]=> array(2) {
[0]=> NULL
[1]=> NULL
}
[2]=> array(2) {
[0]=> NULL
[1]=> NULL
}
}

?>
emory underscore smith at hotmail
18 年前
由于上面没有明确说明,我想指出你不限于使用整数。

但是,这样做时要小心,因为你可能无法得到预期的范围!

为了说明这一点

<?php
$am
= range(500,1600,10);
$fm = range(88.1,107.9,.2);
print_r($am);
print_r($fm);
?>

print_r($am) 给出了预期的结果

数组
(
[0] => 500
[1] => 510
[2] => 520
...
[109] => 1590
[110] => 1600
)

print_r($fm) 则略微(1%)不足

数组
(
[0] => 88.1
[1] => 88.3
[2] => 88.5
...
[97] => 107.5
[98] => 107.7
)

因此,如果你想为数字范围使用非整数值的步长参数,请务必考虑浮点数表示的精度和错误累积;像 pi 或 1/10 这样的步长可能会对较大的范围造成灾难性的影响。如有疑问,请使用整数值步长并进行除法……例如 <?php range(88.1,108,.2) ?> 可能会恢复 107.9,但它不像 <?php array_map(create_function('$x','return $x/10;'),range(881,1079,2)) ?> 那样可扩展。

-emory
subscription101 at hotmail dot com
18 年前
创建偶数范围的更简单方法是从偶数开始

<?php

range
(2, 10, 2);

?>
j dot gizmo at aon dot at
19 年前
我想为下面的 myRange() 函数添加一些更多功能。
现在除了给定 $step 参数,你还可以:
1. 倒序计数
2. 用字母计数
3. 给任何你想要的参数,没有任何(我知道的)会导致无限循环(尝试在前面的函数中使用负 $step……)。

<?php
function myRange($num1, $num2, $step=1)
{
if (
is_numeric($num1) && is_numeric($num2))
{
// 我们有一个数字范围
$step = ( abs($step)>0 ? abs($step) : 1 ); // 使 $step 为正数
$dir = ($num1<=$num2 ? 1 : -1); // 获取方向
for($i = (float)$num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
{
$temp[] = $i;
}
}
else
{
// 我们有一个字符范围
$num1=ord((string)$num1); // 转换为 ASCII 值
$num2=ord((string)$num2);
$step = ( abs($step)>0 ? abs($step) : 1 ); // 使 $step 为正数
$dir = ($num1<=$num2 ? 1 : -1); // 获取方向
for($i = $num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
{
$temp[] = chr($i);
}
}
return
$temp;
}

print_r(myRange( 1, 3, 0.5 )); // 你可以使用小数步长
print_r(myRange( "a", "k", 3 )); // 或者计算字母
print_r(myRange( "5", "9" )); // 即使隐藏在字符串中,数字也会被检测到
print_r(myRange( "!", "%", 1/pi() )); // 或者用毫无意义的参数乱搞

?>
unicod3 at hotmail dot com
9 年前
一个根据字母获取列索引的函数

function getColumnNumber($char){
$alphabet = range('a','z');
$alphabet2 = range('a','z');
$newAlphabet = $alphabet;
foreach($alphabet as $k => $r)
{
foreach($alphabet2 as $row){
$newAlphabet[] = $r.$row;
}
}
$key = array_search($char, $newAlphabet);
return ($key !== false) ? $key : null;
}
Aram Kocharyan
13 年前
这是一个用于从字符串生成范围的函数

<?php

/* 基于给定的格式为“int - int”的范围字符串创建整数数组
例如 range_str('2 - 5'); */
function range_str($str) {
preg_match('#(\\d+)\\s*-\\s*(\\d+)#', $str, $matches);
if (
count($matches) == 3 ) {
return
range($matches[1], $matches[2]);
}
return
FALSE;
}

// 测试
$array = range_str(' 2 - 4 ');
print_r($array);

?>

这将输出

数组
(
[0] => 2
[1] => 3
[2] => 4
)
To Top