Contents
前置き
PHPで
if(empty($変数)){ //変数が空の時の処理 }
と書くと値が設定されてなかったりNULLだった場合以外にも空の配列array()や0、falseである場合などひとまとめにして「空であると同義」とされた時に実行されるようですが、
$array=array("a"=>"","b"=>"");
と書くとこの$arrayは空とみなされないようです。
もし連想配列に何か値が入ってる時に少なくとも必ずこのキーには入ってる仕様であれば
if(empty($array["a"])){ }
などで判別すればいいわけですが、そういうのが無くて全て値が空か否かで判別したいときにはそうはいきません。
でもforeach文を作って各要素毎に判別するのも面倒…
array_filter()関数を使ってみる
そこで、array_filterという関数を使います。
array_filter関数(PHPマニュアル)
これは、配列内の各要素が空かどうかを判別して、無かったらその要素を削除してくれる便利な関数です。(第二引数に関数名を設定すると他の使い方も出来るみたいですね)
$judge=array_filter($array); if(empty($judge)){ //連想配列の値がすべて空の時の処理 }
と書くと連想配列でも値が全て空であれば実行されます!
でも2次元配列ではただ使うだけではうまくいかないので…
とはいえこれだと
$array["a"]["x"]="";
など2次元配列を判定しようとすると、array_filter内の関数で
$array["a”]=Array([x[x]gt;””)←空と判定しないので削除しない!
と処理されてしまいますのでこのままでは使えないですね…
そこで、
$array["["a"]["x"]"; $array["["a"]["y"]; $array["["b"]["x"]alse; $array["["b"]["y"]"; $result=array_filter($array,"array_filter"); if(empty($result)){ echo 1; }
という具合にarray_filterを適用させると各要素に対してもarray_filterが適用されるので2次元配列でも無事1が出力されました(少なくとも私のMAMPの環境では)
関数の挙動の未定義に注意した場合
ただ「配列の内容がコールバック関数内で変更された場合 (たとえば要素が追加されたり削除されたりなど) のこの関数の挙動は未定義です。」
と公式に書かれてますので試してみてその時は使えたとしても、使用環境の変化やバージョンのアップデートなどでこの通りになるとは限らないのは怖いですね。
やはり素直にこんな感じにforeach文を使うが一番安全かな…
$array["["a"]["x"]"; $array["["a"]["y"]; $array["["b"]["x"]alse; $array["["b"]["y"]"; $result=array(); foreach($array as $cont){ $cont=array_filter($cont); if(!empty($cont)){ $result=array_push($result,$cont); } } if(empty($result)){ echo 1; }
$judge=array_filter($array);
if(!empty($judge)){
//連想配列の値がすべて空の時の処理
}
if(!empty($judge))なので、何かしら配列に値がセットされている時の処理ですね。
if(empty($judge))ならば、全て空の時の処理だと思います。
>カレーさん
ご指摘ありがとうございます。仰るとおりでしたので、修正いたしました。