PHPでselectboxを出力する関数を作りました。今までSELECTBOXを出力するたびにコードを書いていたので関数化したら使いやすくなりました。
特別な処理は何もしておらずありきたりな関数ですが、よく使う関数なので、備忘録として載せておきます。(ramda版も作ったのですが、保守がしにくいのでこちらの方がおすすめです)
selectboxを出力するPHPサンプル
function select_box($options, $feeld, $value) {
//optionsかfeeldがnullなら実行しない
if ($options === null || $feeld === null) {
return;
}
echo "<label for='$feeld'>" . PHP_EOL;
echo "<select name='$feeld' id='$feeld' >" . PHP_EOL;
foreach ($options as $key => $displayValue) {
$selected = "";
if ((string)$key === (string)$value) {
$selected =" selected ";
}
echo "<option value='$key' $selected >" . htmlspecialchars($displayValue) . "</option>". PHP_EOL;
}
echo '</select>' . PHP_EOL;
echo '</label>' . PHP_EOL;
}
使い方は以下の通りです。
//連想配列で指定
const FOODS = [
'APPLE' => 'りんご',
'BANANA' => 'バナナ',
'ORANGE' => 'オレンジ'
];
//関数の呼び出し
select_box(FOODS,'food_field',"BANANA");
//配列で指定
const COLORS = [ "RED","BLUE","YELLOW" ];
//関数の呼び出し
select_box(COLORS,'color_field',2);
出力結果はこんな感じです。
当初の予定では連想配列を指定した時は、
PHP [‘APPLE’ => ‘りんご’] → HTML <option value=’APPLE’>りんご<option>
と出力。
配列を指定した時には、
PHP [‘APPLE’] → HTML <option value=’APPLE’>APPLE<option>
と出力したいと思っていたのですが、PHPの仕様で
PHP [0 => ‘APPLE’] //keyが数字で連番の連想配列
と
PHP [‘APPLE’] //配列
の区別がつかず、配列を指定した際には、keyが数字となっています。
ちなみに私はselectboxのonchangeイベントを多用するので、
select_box_JS($options, $feeld, $value,$JS)
を引数としたバージョンも作り、使い分けています。
連想配列と配列を比較する
次のPHPプログラムを実行し比較しました。
const FOODS = [
'APPLE' => 'りんご',
'BANANA' => 'バナナ',
'ORANGE' => 'オレンジ'
];
var_dump(FOODS);
//結果
array(3) { ["APPLE"]=> string(9) "りんご" ["BANANA"]=> string(9) "バナナ" ["ORANGE"]=> string(12) "オレンジ" }
const COLORS = [ "RED","BLUE","YELLOW" ];
var_dump(COLORS);
//結果
array(3) { [0]=> string(3) "RED" [1]=> string(4) "BLUE" [2]=> string(6) "YELLOW" }
const COLORS2 = [ 0=>"RED",1=>"BLUE",2=>"YELLOW" ];
var_dump(COLORS2);
//結果
array(3) { [0]=> string(3) "RED" [1]=> string(4) "BLUE" [2]=> string(6) "YELLOW" }
FOODSとCOLORS2 が連想配列、COLORS は配列です。
しかし、COLORS とCOLORS2 の出力結果は全く同じになっていますので、内部的には同じ形でデータを保管しているようです。
いろいろなHPを確認しましたが、COLORS とCOLORS2の配列形式を判定してくれる関数が見つからなかったので、PHPでは「できない」と判断し、断念しました。
(もし区別がつくなら教えていただきたいです)