フォームのエラー判定で何か問題あれば
$err[ ]にメッセージをつめていくプログラムの場合
連想配列の中身がすっかり空なのか(この場合次のページへいく流れ)
どうかの判定には少し工夫が必要。
初心者用に実験結果と解決法を残しておきます。
$var =[ ];//$varを配列に初期化
Aパターン
$var{'a']="blue";
$var['b']=" ";
$var['c']="red";
Bパターン
$var['a']=" ";
$var['b']=" ";
$var['c']=" ";
いろいろ実験してみます。
・実験1
print_r ($var);
結果
Aパターン
Array ( [a] => blue [b] => [c] => red )
Bパターン
Array ( [a] => [b] => [c] => )
・実験2
if(empty ($var['a'])){
print '空です';
}else{
print '入ってます';}
Aパターンのみ
結果
入ってます
・実験3
if(empty ($var['b'])){
print '空です';
}else{
print '入ってます';}
Aパターンのみ
結果
空です
・実験4
if(empty ($var)){
print '空です';
}else{
print '入ってます';}
Aパターン
結果
入ってます
Bパターン
結果
入ってます
※Bパターンでは配列の中身は空なのにemptyではないと判定されてしまう。(issetでは中身があると判断される)
これは$varという箱の中に、もっと小さな箱a,b,cが入っていますよ、という反応。
これでは配列の中身が空かどうか調べられない。
emptyとは箱の中になにも入ってない状態なので
配列もセットされていてはならない。
ならば連想配列が空の場合、一端それ自体削除してから判定すればよい。
空の連想配列を削除する関数はarray_filter
今回でいうとAパターンの$var['b']なんかはこの関数で
取り除いてくれる
・実験5
print (array_filter($var);
結果 Aパターン
Notice: Array to string conversion in ~
おう?ああ、そうだ。print には配列を渡してはいけないだった。
配列の中身を表示する関数はprint_r
・実験6
print_r (array_filter($var));
結果
Aパターン
Array ( [a] => blue [c] => red )
Bパターン
Array ( )
うむ、うまくいきました。
ということで
連想配列の中身が空かどうかを確認するためのプログラムは
こちら
・実験7
$judge = array_filter($var);
//一番肝心なところでバグがおきてますね。ジャッジと名づけた箱にアレイフィルターを通した配列を入れてます。
if(empty($judge)){
print '空だよ';
}else{
print '安心してください。入ってます。';}
結果
Aパターン
安心してください。入ってます。
Bパターン
空だよ
以上、覚書として残しておきます。
追記
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
コメントでご指摘いただいて修正です。
エラーがある場合配列にエラーメッセージを格納する。
エラーがある場合、再びフォームに戻す、のような場合
これだけで十分でした。
{ }の中は例です。
エラーがなかった場合のプログラムを書きます。
いや~、非常に簡潔です。