1. ホーム
  2. PHP

【PHP】range の使い方|連番・連続した文字の配列を生成する方法

Share

PHP で「1 から 10 までの数字が入った配列がほしい」「a から z までのアルファベットを順番に並べたい」といった場面は意外とよくあります。こうしたとき、for ループで一つずつ要素を追加していくこともできますが、range 関数を使えば連番や連続した文字の配列をたった一行で作れます。この記事では、range の基本的な使い方から、刻み幅の指定、文字での利用、実践的なユースケース、そしてつまずきやすいポイントまでを、初心者〜中級者の方に向けて丁寧に解説します。

range 関数とは何ができるのか

range は、開始値と終了値を渡すと、その間の連続した値を要素に持つ配列を返す関数です。たとえば「1 から 5 までの配列」がほしいとき、素直に書くと次のように for ループを回すことになります。

without-range.php
<?php
// for ループで連番配列を手作りする
$numbers = [];
for ($i = 1; $i <= 5; $i++) {
    $numbers[] = $i;
}

print_r($numbers);
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

やりたいことに対してコードの行数が多く、初期化・条件・加算と気をつける箇所も増えます。これを range で書き換えると、次のようにたった一行で済みます。

with-range.php
<?php
// range なら一行で同じ配列が作れる
$numbers = range(1, 5);

print_r($numbers);
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

コードの意図がひと目で伝わり、書き間違いも起きにくくなります。連番の配列を用意したい場面では、まず range を思い出してください。

基本の使い方 range(開始, 終了)

もっとも基本的な形は range($start, $end) です。第1引数に開始値、第2引数に終了値を渡すと、その両方を含んだ連続する値の配列が返ります。ここで大事なのは、開始値と終了値の両端がどちらも結果に含まれるという点です。range(1, 5) は 1 から 5 までの 5 個で、6 個や 4 個ではありません。

また、開始値のほうが大きい場合は自動的に降順の配列になります。range(5, 1) と書けば、5 から 1 へと減っていく配列が得られます。実際の呼び出しと結果を表にまとめます。

呼び出し結果
range(1, 5)[1, 2, 3, 4, 5]
range(0, 3)[0, 1, 2, 3]
range(5, 1)[5, 4, 3, 2, 1]
range(3, 3)[3]
basic.php
<?php
// 昇順(両端を含む)
print_r(range(1, 5));
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

// 開始のほうが大きいと降順になる
print_r(range(5, 1));
// Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 )

返ってくる配列のキーは 0 から始まる連番です。降順で作った場合も、値が 5・4・3… と並ぶだけで、キー自体は 0 から順に振られます。

第3引数 step で刻み幅を指定する

range には第3引数として刻み幅(step)を渡せます。省略すると 1 ずつ増減しますが、たとえば「2 ずつ」の偶数の配列がほしいときは range(0, 10, 2) のように指定します。

step.php
<?php
// 0 から 10 まで 2 刻み
print_r(range(0, 10, 2));
// Array ( [0] => 0 [1] => 2 [2] => 4 [3] => 6 [4] => 8 [5] => 10 )

刻み幅には小数を渡すこともできます。range(0, 1, 0.1) とすれば、0 から 1 までを 0.1 刻みで並べた配列が得られます。ただし、コンピューターは 0.1 のような小数を内部で正確に表せないため、途中の値にごくわずかな誤差が乗ることがあります。厳密な小数の一致を前提にした比較には向かない、という点だけ頭の片隅に置いておくとよいでしょう。

step-float.php
<?php
// 小数の刻み幅も指定できる
print_r(range(0, 1, 0.1));
// Array ( [0] => 0 [1] => 0.1 [2] => 0.2 ... [10] => 1 )
// ※ 環境によっては浮動小数の誤差が表示に現れることがある

刻み幅は正の数で指定します。降順にしたい場合でも step にマイナスを付ける必要はなく、開始値と終了値の大小関係で向きが決まる仕組みになっています。この点は後半のつまずきどころでも改めて触れます。

文字でも使える range(‘a’, ‘e’)

range は数値だけでなく、文字にも使えます。range('a', 'e') と書けば、a から e までのアルファベットが順番に並んだ配列が返ります。連続したアルファベットのラベルを作りたいときにとても便利です。

char.php
<?php
// アルファベットの連続した配列
print_r(range('a', 'e'));
// Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )

// 大文字も同様
print_r(range('A', 'C'));
// Array ( [0] => A [1] => B [2] => C )

文字を渡すときは、開始・終了ともに 1 文字ずつで指定します。'a''e' のように単独の文字を渡すのが基本の使い方です。選択肢のラベルや、列見出しの記号などを機械的に用意したい場面で活躍します。

実践的な使い方の例

ここからは、range が実際のコードでどう役立つのかを具体的に見ていきます。よくあるのが、foreach と組み合わせて連番の選択肢を作るケースです。たとえば「1 年から 12 か月」を選ぶセレクトボックスの option を、次のように動的に生成できます。

select.php
<?php
// 1〜12 月のセレクトボックスを作る
echo '<select name="month">';
foreach (range(1, 12) as $month) {
    echo "<option value=\"{$month}\">{$month}月</option>";
}
echo '</select>';

数字を直接 12 個並べる必要がなく、範囲を変えるだけで項目数を調整できます。もう一つ、range は集計処理の下ごしらえにも使えます。array_sum と組み合わせれば、「1 から 100 までの合計」も一行で求められます。

sum.php
<?php
// 1 から 100 までの合計
$total = array_sum(range(1, 100));
echo $total; // 5050

// in_array と組み合わせて範囲チェックにも使える
$allowed = range(1, 5);
var_dump(in_array(3, $allowed)); // bool(true)

このように、range で作った配列を array_sumin_array といった配列関数にそのまま渡すことで、集計や範囲判定を簡潔に書けます。連番を作る部分をループから切り離せるので、コードの見通しがよくなります。

range を使うときに気をつけたいこと

開始と終了を逆にすると自動で降順になる

前述のとおり、range は開始値と終了値の大小で並び順を決めます。range(5, 1) のように大きい値を先に渡すと、エラーにはならず降順の配列が返ります。これは便利な仕様ですが、変数を入れ替えて呼び出したときに意図せず逆順になっていた、というミスにもつながります。並び順が結果に影響する場面では、開始と終了の順番を必ず確認しましょう。

step には正の数を渡す

刻み幅は正の数で指定するのが基本です。降順は開始・終了の大小で表現するため、step 自体をマイナスにする必要はありません。なお step に負の数を渡したときの扱いは PHP のバージョンによって異なり、新しいバージョンではエラー(ValueError)になります。いずれにせよマイナスを付ける意味はないので、「逆順にしたいから step もマイナスに」とは考えず、向きは開始と終了の順番で調整すると覚えておきましょう。

文字は1文字どうしで指定する

文字で使うときは、開始・終了ともに 1 文字で渡すのが基本の形です。'a' から 'z' のように単独の文字を組み合わせて指定します。複数文字の文字列を渡したときの挙動は直感的でないことがあるため、連続した 1 文字どうしで指定するのが安全です。

大きな範囲はメモリを消費する

range は指定した範囲の要素をすべて配列として一度にメモリ上に作ります。そのため、range(1, 10000000) のような巨大な範囲を作ると、その分だけメモリを消費します。単にループを回したいだけで配列そのものは不要、という場合は、無理に range で巨大配列を作らず for ループを使うほうがメモリにやさしいこともあります。用途に応じて使い分けてください。

まとめ

range は、開始値と終了値を渡すだけで連続した値の配列を作れる便利な関数です。基本は range($start, $end) で、両端を含んだ連番が得られ、開始のほうが大きければ降順になります。第3引数で刻み幅を指定でき、range(0, 10, 2) のような飛び飛びの配列や、小数刻みの配列も作れます。数値だけでなく range('a', 'e') のように文字にも使え、アルファベットの連番を手軽に用意できます。foreach でセレクトボックスの選択肢を作ったり、array_sum(range(1, 100)) で合計を求めたりと、実践でも活躍します。開始と終了の順番で並び順が決まること、step は正の数で指定すること、大きな範囲はメモリを消費することだけ押さえておけば、安心して使えるはずです。連番や連続文字の配列がほしくなったら、まず range を思い出してみてください。

参考ページ