まず、変数が空であるかどうかのチェックを empty() に委ねる場合を考える。empty() では次のような値は空とみなされる。
""(空文字列)0(整数 の 0)0.0(浮動小数点数の 0)"0"(文字列 の 0)NULLFALSEarray()(空の配列)
これらは boolean に変換すると全て false とみなされる値となる。
また、array_filter() は、コールバック関数が与えられなかった場合、配列要素の中で boolean に変換して false に等しいものを削除してくれる。
よって、empty() で空とみなされる値を削除したい場合は、array_filter() を使って配列から空の要素を削除することができる。
// booleanに変換すると全てfalseとみなされる値
$array = ["", 0, 0.0, "0", NULL, false, []];
foreach ($array as $v)
{
var_dump((bool)$v);
/*
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
*/
}
// 配列要素の中でbooleanに変換してfalseに等しいものを削除
$array = array_filter($array);
var_dump($array);
/*
array(0) {
}
*/
次に、変数が空であるかどうかを empty() だけでチェックできない場合を考える。例えば、数値や論理値、文字列の "0" を空とみなさない場合である。
独自に変数の値が空かどうかを判定する blank() を定義する。この関数の定義は、Laravelのヘルパー関数 blank() を参考にした。
framework/helpers.php at master · laravel/framework · GitHub
そして、blank() の返り値の逆を返す not_blank() を定義し、array_filter() のコールバック関数に指定すると、blank() で空とみなされる要素が削除された配列を得ることができる。
function blank($value)
{
if (is_null($value)) {
return true;
}
if (is_string($value)) {
return trim($value) === '';
}
// 数値や論理値は空とみなさない
if (is_numeric($value) || is_bool($value)) {
return false;
}
return empty($value);
}
function not_blank($value)
{
return !blank($value);
}
$array = ["", 0, 0.0, "0", NULL, false, []];
// blank()で空とみなす要素を削除
$array = array_filter($array, "not_blank");
var_dump($array);
/*
blank()では数値や論理値、文字列の"0"を空とみなさないので、削除されない
array(4) {
[1]=>
int(0)
[2]=>
float(0)
[3]=>
string(1) "0"
[5]=>
bool(false)
}
*/