連想配列の中身が空かどうかを確認する。wondaの備忘録


フォームのエラー判定で何か問題あれば
$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パターン
空だよ

以上、覚書として残しておきます。

追記
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
コメントでご指摘いただいて修正です。

エラーがある場合配列にエラーメッセージを格納する。
エラーがある場合、再びフォームに戻す、のような場合
これだけで十分でした。

{ }の中は例です。
エラーがなかった場合のプログラムを書きます。

いや~、非常に簡潔です。