PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

reset> <prev
Last updated: Sun, 25 Nov 2007

view this page in

range

(PHP 4, PHP 5)

range — 특정 범위의 원소를 갖는 배열을 생성한다

설명

array range ( int $low , int $high [, int $step ] )

range()low 에서 high (포함하여)까지의 원소를 갖는 배열을 반환한다, low > high 일 경우에는 일련값은 high에서 low까지가 될것이다.

Note: 새로운 매개변수 선택적인 step 매개변수가 5.0.0에서 추가되었다.

step 값이 주어지면, 연속적인 원소들의 증가값으로 사용될것이다. step 은 양수로 주어져야 한다. 이 값이 주어지지 않으면, step 의 기본값은 1이다.

Example#1 range() 예제코드

<?php
// array(0,1,2,3,4,5,6,7,8,9,10,11,12)
foreach(range(012) as $number) {
    echo 
$number;
}

// 5.0.0 부터 stemp 매개변수가 추가되었다
// array(0,10,20,30,40,50,60,70,80,90,100)
foreach(range(010010) as $number) {
    echo 
$number;
}

// 4.1.0 부터 문자 연속값들이 지원된다
// array('a','b','c','d','e','f','g','h','i');
foreach(range('a''i') as $letter) {
    echo 
$letter;
}
// array('c','b','a');
foreach(range('c''a') as $letter) {
    echo 
$letter;
}
?>

Note: PHP 4.1.0 이전 버전에서, range()는 증가하는 정수 배열만 생성했었다. 문자 연속값과 감소 배열의 지원이 4.1.0에 추가되었다. 문자 연속 값은 한 문자로 제한된다. 1보다 큰값이 들어가면, 첫번째 문자만 사용된다.

Caution

PHP 4.1.0부터 4.3.2버전까지, range() 는 숫자형의 문자열을 숫자형이 아닌 문자열로 본다. 그래서, 그 값들은 문자 연속값으로 사용될것이다. 예를 들면, "4242""4"로 취급된다.

shuffle(), array_fill(), foreach 참고.



reset> <prev
Last updated: Sun, 25 Nov 2007
 
add a note add a note User Contributed Notes
range
ThinkMedical at Gmail dot com
26-Aug-2008 05:11
foreach(range()) whilst efficiant in other languages, such as python, it is not (compared to a for) in php*.

php is a C-inspired language and thus for is entirely in-keeping with the lanuage aethetic to use it

<?php
//efficiant
for($i = $start; $i < $end; $i+=$step)
{
       
//do something with array
}

//inefficiant
foreach(range($start, $end, $step) as $i)
{
       
//do something with array
}
?>

That the officiant documentation doesnt mention the for loop is strange.

Note however, that in PHP5 foreach is faster than for when iterating without incrementing a variable.

* My tests using microtime and 100 000 iterations consistently (~10 times) show that for is 4x faster than foreach(range()).
captvanhalen at gmail dot com
27-Mar-2008 11:33
Here is a home rolled range() function that uses the step feature for those unfortunate souls who cannot use 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;
}
?>
chris at laflash dot org
09-May-2007 04:47
Quick HTML menus with minimum and maximum sets of years:

<?php
   
/*
    ** Quick HTML menus with minimum and maximum sets of years.
    ** @author Chris Charlton <chris@laflash.org>
    ** @license FREE!
    */

    // Years range setup
   
$year_built_min = 1900;
   
$year_built_max = date("Y");
?>
<select id="yearBuiltMin" size="1">
    <?php // Generate minimum years

       
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 // Generate max years

       
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
01-Mar-2007 05:46
Here's how i use it to check if array is associative or not:

<?php

if (array_keys($arr)===range(0, sizeof($arr)-1)) {
// not associative array

} else {
// associative array

}

?>
manuel at levante dot de
07-Nov-2006 05:25
<?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));
?>

Return:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 6
    [5] => 7
    [6] => 9
    [7] => 10
)
subscription101 at hotmail dot com
08-Jan-2006 06:36
A much simpler way of creating a range of even numbers is by starting with an even number:

<?php

    range
(2, 10, 2);

?>
emory underscore smith at hotmail
20-Aug-2005 07:53
since its not stated explicitly above, thought id point out that you arent limited to using integers.

however, be careful when doing so, as you might not get the range you expect!

to illustrate:

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

print_r($am) yields the expected result:
            
Array
(
    [0] => 500
    [1] => 510
    [2] => 520
    ...
    [109] => 1590
    [110] => 1600
)

print_r($fm), however, falls a bit (1%) short:

Array
(
    [0] => 88.1
    [1] => 88.3
    [2] => 88.5
    ...
    [97] => 107.5
    [98] => 107.7
)
   
so, if you want to use a non-integral step size params for numeric ranges, be sure to account for fp representation accuracy and error accumulation; a step size of something like pi or 1/10 could spell disaster for a large range. if in doubt, use integral steps and divide ... something like <?php range(88.1,108,.2) ?> might work to recover 107.9, but would not be scalable like, say <?php array_map(create_function('$x','return $x/10;'),range(881,1079,2)) ?>.

-emory
derek at php dot net
08-May-2005 06:13
This should emulate range() a little better.
<?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)) {
       
//numeric sequence
       
for ($i = (float)$low; $i*$sign <= $high*$sign; $i += $step*$sign)
           
$arr[] = $i;
    }    else    {
       
//character sequence
       
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;
}
?>
j dot gizmo at aon dot at
23-Sep-2004 04:23
i figured i'd add some more functionality to the myRange() functions below.
now you can, besides giving a $step parameter,
1. count backwards
2. count with letters
3. give whatever parameter you want, there's nothing (i know of) that will cause an endless loop (try a negative $step for the previous function....)

<?php
function myRange($num1, $num2, $step=1)
{
    if (
is_numeric($num1) && is_numeric($num2))
    {
       
//we have a numeric range
       
$step = ( abs($step)>0 ? abs($step) : 1 ); //make $step positive
       
$dir = ($num1<=$num2 ? 1 : -1); //get the direction
       
for($i = (float)$num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
        {
           
$temp[] = $i;
        }
    }
    else
    {
       
//we have a character range
       
$num1=ord((string)$num1); //convert to ascii value
       
$num2=ord((string)$num2);
       
$step = ( abs($step)>0 ? abs($step) : 1 ); //make $step positive
       
$dir = ($num1<=$num2 ? 1 : -1); //get direction
       
for($i = $num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
        {
           
$temp[] = chr($i);
        }
    }
    return
$temp;
}

print_r(myRange( 1, 3, 0.5 )); //you can use fractional steps
print_r(myRange( "a", "k", 3 )); //or count letters
print_r(myRange( "5", "9" )); //numbers are detected even if hidden in strtings
print_r(myRange( "!", "%", 1/pi() )); //or mess around with senseless parameters

?>
donwilson at gmail dot com
31-Aug-2004 09:38
To speed your MyRange() function, I have created a much nicer function with less code to sift through to include the step parameter.

<?php   
   
// range() limitation for PHP <5.0.0
   
function myRange($num1, $num2, $step=1)
    {
        for(
$i = $num1; $i <= $num2; $i += $step)
        {
           
$temp[] = $i;
        }
       
        return
$temp;
    }
?>

For whatever reason my comment was deleted..?
Forrester at tfcustomized dot com
17-May-2004 07:57
Since users of < PHP 5.0.0 don't have the option of the step parameter, I've created a little function to account for it:

@USAGE: (int low, int high [, int step])

function myRange($low,$high,$step=1)
{
$ranArray = range($low,$high);
$step--;
$keys = count($ranArray);
    for($i=0;$i<$keys;$i++)
    {
    $retArray[] = $ranArray[$i];
    $i = $i + $step;
    }
return $retArray;
}

// Example usage:
print_r(myRange(1,11,2));
// Returns the array:
// [0] => 1
// [1] => 3
// [2] => 5
// [3] => 7
// [4] => 9
// [5] => 11

reset> <prev
Last updated: Sun, 25 Nov 2007
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites