【PHP】array_filterで空文字の要素を削除する

やりたいこと

既に実装済みのメソッドを呼び出したところ、戻り値の配列内に空文字の要素があった。

空文字の要素は後続の処理に影響があるため削除したい。

方法

簡易版

array_filterに配列のみ渡す。

https://www.php.net/manual/ja/function.array-filter.php

$input = [
    "AB01", "", "CD23", "", "EF45"
];
$result = array_filter($input);
var_dump($result);

実行すると空文字の要素は削除される。

array(3) {
  [0]=>
  string(4) "AB01"
  [2]=>
  string(4) "CD23"
  [4]=>
  string(4) "EF45"
}

この場合、内部的にはempty()がtrueとなる値が削除される。

そのため、nullやfalse、それぞれの型の初期値なども削除される。

https://www.php.net/manual/ja/function.empty.php

様々な入力値で同じ処理を通してみる。

$input = [
    null,
    true, false,
    0, 1, -1,
    0.0, 0.1, -0.1,
    "", "0", "1", "a",
    [], [1, 2, 3],
    new DateTime(),
    function() {}
];
$result = array_filter($input);
var_dump($result);
array(10) {
  [1]=>
  bool(true)
  [4]=>
  int(1)
  [5]=>
  int(-1)
  [7]=>
  float(0.1)
  [8]=>
  float(-0.1)
  [11]=>
  string(1) "1"
  [12]=>
  string(1) "a"
  [14]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  [15]=>
  object(DateTime)#1 (3) {
    ["date"]=>
    string(26) "2022-08-21 10:48:57.930117"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(3) "UTC"
  }
  [16]=>
  object(Closure)#2 (0) {
  }
}

もしempty()での判定に不都合がある場合、コールバック関数を使用して不要な値を狙って削除する。

コールバック関数使用

array_filterに空文字を判定するコールバック関数を渡す。

$input = [
    null,
    true, false,
    0, 1, -1,
    0.0, 0.1, -0.1,
    "", "0", "1", "a",
    [], [1, 2, 3],
    new DateTime(),
    function() {}
];
$result = array_filter(
    $input,
    function($value) {
        return $value !== "";
    }
);
var_dump($result);

空文字の要素のみ削除された。

array(16) {
  [0]=>
  NULL
  [1]=>
  bool(true)
  [2]=>
  bool(false)
  [3]=>
  int(0)
  [4]=>
  int(1)
  [5]=>
  int(-1)
  [6]=>
  float(0)
  [7]=>
  float(0.1)
  [8]=>
  float(-0.1)
  [10]=>
  string(1) "0"
  [11]=>
  string(1) "1"
  [12]=>
  string(1) "a"
  [13]=>
  array(0) {
  }
  [14]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  [15]=>
  object(DateTime)#1 (3) {
    ["date"]=>
    string(26) "2022-08-21 10:50:29.947398"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(3) "UTC"
  }
  [16]=>
  object(Closure)#2 (0) {
  }
カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。