タグのvalueの値は数値か文字か

タグの属性で「value="1"」や「value=1」とした場合、この値をスクリプト(以下はPHPで実験)で取得したとき、その「1」は数値か、それとも文字列か。
このvalueが「value="sample"」などになっていれば文字列であることは明白だが、単純な数値の場合はちょっと戸惑ってしまう。

サンプル 「value="1"」型 <input type="checkbox" name="talent[]" value="1">篠崎愛 <input type="checkbox" name="talent[]" value="2">本田美穂 <input type="checkbox" name="talent[]" value="3">有村架純 <input type="checkbox" name="talent[]" value="4">能年玲奈 <input type="checkbox" name="talent[]" value="5">高畑充希 「value=1」型 <input type="checkbox" name="talent[]" value=1>篠崎愛 <input type="checkbox" name="talent[]" value=2>本田美穂 <input type="checkbox" name="talent[]" value=3>有村架純 <input type="checkbox" name="talent[]" value=4>能年玲奈 <input type="checkbox" name="talent[]" value=5>高畑充希

これらはどちらの場合も文字列である。「"1"」だから文字列で、「1」だから数値だというような、「書き方」による区別はない

最初の項目の「篠崎愛」をチェックして、それが「数値」であるとして調べると「チェックされていません」になる。それが「文字列」であるとして調べると「チェックされています」になる。このことから「1」が文字列であることがわかる。

プログラミング $var = $_POST["talent"]; if(is_array($var)) { //数値とした場合 $flag = in_array(1, $var, true); if($flag == true) { echo "○ 篠崎愛はチェックされています。"; } else { echo "× 篠崎愛はチェックされていません。"; } //文字(列)とした場合 $flag = in_array("1", $var, true); if($flag == true) { echo "○ 篠崎愛はチェックされています。"; } else { echo "× 篠崎愛はチェックされていません。"; } }

次に、上のようなフォームで、チェックボックスでチェックした項目のvalueのデータを配列に取得するという場合、勘違いするのは、フォームには項目が5個あるから、配列の要素も5個あると思ってしまうことである。
ここで、たとえば「1,3,5」番目をチェックして次のようなもので調べると、配列の要素数は3個になっている。

プログラミング $var = $_POST["talent"]; if(is_array($var)) { foreach($var as $num => $element) { echo $num . " --- " . $element . "<br>\n"; } }

実行結果
0 --- 1
1 --- 3
2 --- 5

チェックしていないデータは送信されない。「無」として扱われる。ここで取得される配列の要素数は固定的なものではない。チェックの具合によってその要素数がコロコロと変わる可変的な配列である。それは次のようなデータと同じものになる。

SAMPLE
//全部チェックした場合
$var = array("1", "2", "3", "4", "5");

//1,3,5番目をチェックした場合
$var = array("1", "3", "5");

//4,5番目をチェックした場合
$var = array("4", "5");

以上、フォームの外見から受けるイメージに引っ張られて、「あらぬ」方向のドロ沼に落ち込んでしまいやすい点である。この場合、valueの値に単純な数値を使わなければ「ドロ沼」へ落ち込むことは格段に減ることになる。

- 2018/11/05 -