ユーザーに数字を入力させるために、1から10といったセレクトボックスを作成することがありますが、CakePHPの場合、FormHelperで使う数字の配列をrange()を使って生成する方法があるが、値に入力される数字と表示される数字が異なります。そこでarray_combine()を使うと簡単!

CakePHPでセレクトボックスを作成する方法

CakePHPで数字を選択できるセレクトボックスを作成するには、公式ドキュメントにもあるようにFormHelperを使って下記のように書く。

echo $this->Form->input('field', array(
    'options' => array(1, 2, 3, 4, 5),
    'empty' => '選択してください'
));

値の数字と表示される数字がズレる

1から5ならまだこうやって書けるけど、1から100とか、1、6、11といった5つ飛ばしで書くとなると下記の書き方が非常に楽だ。

echo $this->Form->input('field', array(
    'options' => range(1, 5),
    'empty' => '選択してください'
)); 

でも、これだと前述した通り下記のように値と表示される数字がズレてしまいます。

<select name="field">
    <option value="">選択してください</option>
    <option value="0">1</option>
    <option value="1">2</option>
    <option value="2">3</option>
    <option value="3">4</option>
    <option value="4">5</option>
</select>

この問題を解決するためにmyRange()とか独自の関数を作成する人もいるけど、既存の関数を組み合わせれば意外と簡単に問題は解決する。

array_combine()を使って配列を生成

このarray_combine()は、第1引数の配列をキー、第2引数の配列を値として、新しい配列を作る関数です。

echo $this->Form->input('field', array(
    'options' => array_combine(
        range(1, 5),
        range(1, 5)
    ),
    'empty' => '選択してください'
)); 

これで、

<select name="field">
    <option value="">選択してください</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
</select>

となる。

1つ飛ばしや5つ飛ばしだって簡単に

echo $this->Form->input('field', array(
    'options' => array_combine(
        range(1, 21, 5),
        range(1, 21, 5)
    ),
    'empty' => '選択してください'
));

こう記述すれば、

<select name="field">
    <option value="">選択してください</option>
    <option value="1">1</option>
    <option value="6">6</option>
    <option value="11">11</option>
    <option value="16">16</option>
    <option value="21">21</option>
</select>

ってことだって、簡単に書けるんだな。