PHPの range関数を使った色々な配列の生成
2012.09.22
配列を生成するには幾つかの方法がありますが、ある特定の範囲に限って配列を生成する場合に自分はrange関数を良く使います。
range() の応用 - 文字列
PHPマニュアルによると 『ある範囲の整数を有する配列を作成します』 とありますが、同ページ内にあるサンプルのように文字列の配列も生成可能(PHP 4.1.0 以降)なので【A】から【Z】までのアルファベットを頭文字としたDB検索用インデックスとして配置したりする場合に重宝しています。(参考:ASCII文字コード)
他にも特定のIDの範囲(この場合は整数)を配列化してSQLを連続発行したり、特定の期間(この場合はUNIXタイム)を限定してカレンダーを生成したりと、応用範囲は広いと思います。
PHP.net 公式マニュアル
- range - ある範囲の整数を有する配列を作成する
- time - 現在の Unix タイムスタンプを返す
- date - ローカルの日付/時刻を書式化する
- getdate - 日付/時刻情報を取得する
sample_range_1.php : Sample Code
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>roomX.jp | PHP | range - Sample.1</title> <style> table { background-color: #eeeeee; } td { border-color: #c9c9c9; border-style: solid; border-width: 1px; padding: 5px; } </style> </head> <body> <h1>PHP : range - Sample.1</h1> <h2>A to Z INDEX</h2> <?php $arr_A2Z = range('A','Z'); //A-Z 配列化 echo "<table>"; echo "<tr>"; foreach($arr_A2Z as $char){ echo "<td><a href=\"#\">".$char."</a></td>"; } echo "</tr>"; echo "</table>"; ?> </body> </html>
アルファベットは小文字だけで無く大文字もOKデス。
実際には<table>タグではなく、divで括ってもっとカッチョよく装飾する場合が殆どだと思いますがサンプルなのでご容赦を…(^^;
上のサンプルでは <a href= ~ >の中身(具体的なリンク先)を記述していませんが、アルファベット一文字をパラメーターとして渡す場合の『ABC順の索引』を作成する手間が大幅に省けますし、HTML的にはテーブルタグだけでなく、ラジオボタンやドロップリストなどにも適用できます。
range() の応用 - 日付
range() の基本的な書式はPHPの公式マニュアルを参照してもらうとして、ココでは range() を使って現在の日付(UNIXタイム)から1日毎のUNIXタイムを30日後まで配列化したのち、再度UNIXタイムを日付に変換して画面に出力するコードを書いてみました。
getdate() を使えば現在の全ての時刻情報を連想配列として取得できますが、今回は秒の単位までは必要ないので getdate() は使っていません。時間単位、分単位まで管理するようなToDoリストを造りたい場合は getdate() を使って現在の時刻情報を取得した方が効率が良いと思います。
sample_range_2.php : Sample Code
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>roomX.jp | PHP | range - Sample.2</title> </head> <body> <h1>PHP : range - Sample.2</h1> <h2>Today + 30days</h2> <?php date_default_timezone_set('Asia/Tokyo'); $now = mktime(0,0,0,date("m"),date("d"),date("Y")); $fet = $now + (86400 * 29); //現在+29日=計30日化 $step = 86400; $arr_time = range($now, $fet, $step); //現在→30日後まで1日刻みで配列化 echo "<ol>"; foreach($arr_time as $time){ $date = date("Y-m-d \(D\)",$time); echo "<li>".$date."</li>"; } echo "</ol>"; ?> </body> </html>
今回は date() 関数の出力フォーマットとして、曜日要素の“D”オプションも使っています。
また30日間が正しく配列として生成されているかを確認する為に<ol>タグを使っていますが、HTMLタグは目的やお好みに応じて使い分けて下さい。