PHPで配列から空の要素を取り除く方法

こんにちは、さるまりんです。

配列が空かどうかをチェックしている時、こんなことがありました。

変数$stringには何かしら文字列があり、それがカンマ区切りだと想定して分割して配列にします。
で、それが空かどうか?をチェックしたかったのでこんなプログラムを書きました。

$array_of_strings = explode(",", $string);

if (empty($array_of_strings)) {
  echo "array is empty\n";
} else {
  echo "array is not empty\n";
}

$stringはこんな感じなのを想定していました。

$string = 'code1,code2,code3';

設定なしの意味でこれ、

$string = '';

だと、$array_of_stringsの配列は空にはならず、実行結果はこうなります。

$ php empty-array.php
array is not empty

$array_of_stringsの中身を表示してみるとこうなっていました。

Array
(
    [0] => 
)

空の要素を一つ含む配列になっているんですね。
これでは空文字列が設定された時に、設定が空かどうかチェックできないです。

ちなみに$stringnull

$string = null;

だとこんな警告が出ます。

$ php empty-array.php
PHP Deprecated:  explode(): Passing null to parameter #2 ($string) of type string is deprecated in /Users/salumarine/empty-array.php on line 7

Deprecated: explode(): Passing null to parameter #2 ($string) of type string is deprecated in /Users/salumarine/empty-array.php on line 7
array is not empty

本題に戻ります。

これでは意図通りにはならないので、explode()関数で分割した後に空の要素を消したい。

array_filter()関数を使ってこれを実装しました。

$array_of_strings = explode(",", $string);
$array_of_strings = array_filter($array_of_strings, fn($v) => !empty($v));

if (empty($array_of_strings)) {
  echo "array is empty\n";
} else {
  echo "array is not empty\n";
}

array_filter()は配列を一つ目の引数としてとり、二つ目は関数を取ります。
要素を引数として結果が正trueとなるものを残すします。
このチェック内容は!empty($v)で「空ではない」ものをが残ります。

上の書き方はPHP7.4以降で使えますが、それ以前でPHP5.3以降ではこうなります。

$array_of_strings = array_filter($array_of_strings, function($v) { return !empty($v); });

(それ以前だとcreate_functionを使いますが、それは省略します。)

二つ目には関数を渡すのでこれでも想定したように動いてくれます。

$array_of_strings = array_filter($array_of_strings, 'strlen');

strlen()は引数の長さが何文字かを返す関数です。空文字列の場合は0が返るのでfalse扱い、それ以外は数値が戻るのでtrue扱いです。

実行したらこうなりました。

$ php empty-array.php
array is empty

これで意図してたようにチェックできるようになりました。

まあ、explode()関数に空文字列を渡すと空の要素を一つ持つ配列になると知っていれば良いことなのです。文字列をこんな風に使うことは結構やっているので覚えておこうと思います。

読んでくださってありがとうございました。

それではまた!