|
 |
range (PHP 3 >= 3.0.8, PHP 4, PHP 5) range --
Создать массив, содержащий диапазон элементов
Описаниеarray range ( number low, number high [, number step] )
range() возвращает массив элементов с
low по high,
включительно. Если low > high, последовательность будет убывающей.
New parameter:
Дополнительный параметр step был добавлен в PHP 5.0.0.
Если указан параметр step, он будет использоваться как
инкремент между элементами последовательности. step
должен быть положительным числом. Если
step не указан, он принимает значение по умолчанию 1.
Пример 1. Примеры использования range()
<?php
foreach (range(0, 12) as $number) {
echo $number;
}
foreach (range(0, 100, 10) as $number) {
echo $number;
}
foreach (range('a', 'i') as $letter) {
echo $letter;
}
foreach (range('c', 'a') as $letter) {
echo $letter;
}
?>
|
|
Замечание:
До появления PHP 4.1.0, range() создавала
только массивы, содержащие диапазон чисел в порядке возрастания.
Поддержка последовательностей знаков и создания диапазона в порядке
убывания была добавлена в версии 4.1.0. Диапазон знаков можно
задать только при помощи строки из одного знака. Если длина такой строки будет более
одного знака, будет использован первый знак.
Предостережение |
В PHP версий с 4.1.0 по 4.3.2, range() рассматривал
числовые строки именно как строки, а не числа. Вместо них использовалась
последовательность знаков. Например, "4242"
трактовалось "4".
|
См. также shuffle(),
array_fill() и
foreach.
range
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)) {
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;
}
?>
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))
{
$step = ( abs($step)>0 ? abs($step) : 1 ); $dir = ($num1<=$num2 ? 1 : -1); for($i = (float)$num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
{
$temp[] = $i;
}
}
else
{
$num1=ord((string)$num1); $num2=ord((string)$num2);
$step = ( abs($step)>0 ? abs($step) : 1 ); $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() )); ?>
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
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
| |