配列から空の要素を削除する

まず、変数が空であるかどうかのチェックを 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)
}
*/