range関数の地味だが便利な使い方

range とは、始点と終点を渡すだけで連続した値の配列を作る関数です。両端を含み、数値だけでなく文字にも使えて、第3引数で刻み幅も変えられます。

連番を一行で作る

ループを回して $i を push していくコード、たまに見かけますが、単純な連番なら range で一発です。始点と終点を渡すだけで配列が返ってきます。両端を含むのがポイントで、ここが for ループとの感覚の違いですね。

$nums = range(1, 5);
// [1, 2, 3, 4, 5] 5も含まれる

$down = range(10, 6);
// [10, 9, 8, 7, 6] 逆順もそのまま作れる

プルダウンの選択肢や、テスト用のダミーデータを作るときにさっと書けるのが良いところだと思います。

文字の範囲も作れる

意外と知られていない気がするのですが、range は文字にも使えます。内部的には ASCII コードで数えているので、アルファベット一覧などが簡単に作れます。座席記号やコード生成でたまに役立ちます。

$alpha = range('a', 'e');
// ['a', 'b', 'c', 'd', 'e']

$caps = range('A', 'Z');
// A から Z まで26文字

// 座席ラベルの下ごしらえに
foreach (range('A', 'C') as $row) {
    echo $row . "列\n";
}

第3引数のstepで刻み幅を変える

第3引数を渡すと刻み幅を指定できます。偶数だけ、5とび、小数刻みなども作れます。step は常に正の値で渡すのが約束で、下り順にしたいときは始点と終点を入れ替えます。

$even = range(0, 10, 2);
// [0, 2, 4, 6, 8, 10]

$decimals = range(0, 1, 0.25);
// [0, 0.25, 0.5, 0.75, 1]

// 逆順で5とび
$rev = range(20, 0, 5);
// [20, 15, 10, 5, 0]

小数の step は浮動小数点の丸め誤差が絡むことがあるので、金額のように厳密さが要る場面では整数で作ってから割る、といった工夫をしたほうが安心だと思います。

まとめ

range は「連続した値をまとめて欲しい」ときの手軽な相棒で、数値だけでなく文字にも効くのが地味に嬉しいところです。両端を含むこと、step は正の値で渡すこと、小数刻みは誤差に注意、この3点を頭の隅に置いておけば大抵の場面で気持ちよく使えると思います。

よくある質問

Q. 終点の値は含まれますか?
A. 含まれます。range(1, 5) は5まで入った [1, 2, 3, 4, 5] になります。for ループの感覚とずれやすいので注意してください。

Q. 逆順の連番は作れますか?
A. 始点と終点を入れ替えればできます。range(10, 6)[10, 9, 8, 7, 6] になります。step は常に正の値で渡します。

Q. 小数刻みで気をつけることは?
A. 浮動小数点の丸め誤差が絡むことがあります。金額のように厳密さが要る場面では、整数で作ってから割るほうが安心です。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です