PHP Conference Japan 2024

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
  • 如果 stepfloat,並且 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 如果 startendarrayobjectresource,則現在會拋出 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
12 年前
要建立像這樣的範圍陣列

陣列
(
[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
9 年前
即使您的數值參數包含在引號中,該函式也會產生一個整數陣列。
<?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).' 秒。',
);
}
var_dump(natural_prime_numbers(range(0, 11))); // 這裡使用 range() 函式 ;-)

// 結果:
// array (大小=3)
// 'length_prime_numbers' => int 5
// 'prime_numbers' =>
// array (大小=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 除以 '...

// **************************** //
//
// * 請記住,該函式是遞迴的,也就是說:在 Intel® Core™ i5-8250U (3.40 GHz) 處理器上,範圍為 5000 需要超過 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;
}

/*
* 例如: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
16 年前
雖然 foreach(range()) 在其他語言(例如 Python)中很有效率,但在 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 <chris@laflash.org>
** @license 免費!
*/

// 年份範圍設定
$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(包含 BI)的所有欄位名稱。
createColumnsArray('BI');

?>
me at phpscott dot com
12 年前
所以,我需要一個快速且簡便的方法來為小時、分鐘和秒建立下拉式選單,並使用 2 位數格式化,為了建立這些資料陣列,我將 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 年前
對於那些無法使用 PHP5 的不幸人士,這裡有一個自製的 range() 函數,它使用了 step 功能。

<?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
11 年前
我最近才認識 `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
18 年前
<?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
1 年前
他們忘記說一些事。
如果結束值沒有遇到最後一個序列,函式會回傳 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` 參數,而不像大多數其他語言一樣只包含到但不包含 `end` 參數。
以下程式碼片段應該可以解釋我所說的負數步進:

<?php

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

?>

基本上發生的情況是,range 函式並不在意哪個比較大或比較小,它只是將步進值加到起始值,並將其附加到暫時的結果變數中,只要它還沒達到結束參數值。在這種情況下,加上負數就像減法(電腦在底層使用二補數來執行)。這會使數字從 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
11 年前
要建立一個具有指定大小和 null 值的簡單陣列或多維陣列,請使用此表達式

<?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
19 年前
由於上面沒有明確說明,我想指出您不限於使用整數。

但是,這樣做時要小心,因為您可能無法獲得預期的範圍!

為了說明

<?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
20 年前
我想我應該為下面的 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
10 年前
一個透過字母取得欄索引的函式

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