まず、変数が空であるかどうかのチェックを empty()
に委ねる場合を考える。empty()
では次のような値は空とみなされる。
""
(空文字列)0
(整数 の 0)0.0
(浮動小数点数の 0)"0"
(文字列 の 0)NULL
FALSE
array()
(空の配列)
これらは 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)
}
*/