こんにちは、さるまりんです。
配列が空かどうかをチェックしている時、こんなことがありました。
変数$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] =>
)
空の要素を一つ含む配列になっているんですね。
これでは空文字列が設定された時に、設定が空かどうかチェックできないです。
ちなみに$string
がnull
$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()
関数に空文字列を渡すと空の要素を一つ持つ配列になると知っていれば良いことなのです。文字列をこんな風に使うことは結構やっているので覚えておこうと思います。
読んでくださってありがとうございました。
それではまた!