【PHP】explodeで文字列を分割したときに空の要素をすべて削除する3つの方法
PHPで文字列を explode() などで分割すると、区切り文字が連続している場合に配列へ空の要素が混ざってしまいます。こうした空の値をすべて削除するには、array_filter() または preg_split() の PREG_SPLIT_NO_EMPTY オプションを使用します。
- array_filter() を単独で使う
- array_filter() にコールバック関数 strlen を指定する
- preg_split() に PREG_SPLIT_NO_EMPTY フラグを付ける
サンプルコード
<?php
$_POST['tag'] = ",abc,defg,,,hijk,lmnop,,0,,";
echo "--- バージョン1: array_filter ----\n";
// 注意:この書き方では「0」も除外されます。
// PHPでは (bool)"0" は FALSE になるためです。
// 引数を1つだけで呼び出した array_filter() は、各要素を真偽値として評価します。
$tags = array_filter( explode(",", $_POST['tag']) );
var_dump($tags);
echo "--- バージョン2: array_filter/strlen ----\n";
// 第2引数に strlen を指定すると「0」要素も保持されます。
// 各要素に対して strlen() が呼び出され、その結果が真偽値として判定されます。
$tags = array_filter( explode(",", $_POST['tag']), 'strlen' );
var_dump($tags);
echo "--- バージョン3: PREG_SPLIT_NO_EMPTY ----\n";
// 分割時に空文字列を生成しないため、後段のフィルタ処理が不要になります。
$tags = preg_split('/,/', $_POST['tag'], -1, PREG_SPLIT_NO_EMPTY);
var_dump($tags);
出力結果
上記のコードを実行すると、次のような出力が得られます。
--- バージョン1: array_filter ----
array(4) {
[1]=> string(3) "abc"
[2]=> string(4) "defg"
[5]=> string(4) "hijk"
[6]=> string(5) "lmnop"
}
--- バージョン2: array_filter/strlen ----
array(5) {
[1]=> string(3) "abc"
[2]=> string(4) "defg"
[5]=> string(4) "hijk"
[6]=> string(5) "lmnop"
[8]=> string(1) "0"
}
--- バージョン3: PREG_SPLIT_NO_EMPTY ----
array(5) {
[0]=> string(3) "abc"
[1]=> string(4) "defg"
[2]=> string(4) "hijk"
[3]=> string(5) "lmnop"
[4]=> string(1) "0"
}
各方法のポイントと注意点
1. array_filter() 単体:「0」まで消える落とし穴に注意
第2引数を省略した array_filter() は、各要素を真偽値として評価します。PHPでは文字列 "0" をブール変換すると false 扱いになるため、意味のあるデータである「0」まで一緒に削除されてしまいます。
2. コールバックに strlen を指定:安全な定番パターン
array_filter($tags, 'strlen') とすれば「長さ0以外の要素」だけが残るため、"0" も正しく保持されます。ただし半角スペースなど空白のみの要素は長さを持つため残る点には注意してください。コールバックに 'trim' を指定すれば、空白だけの要素もまとめて除去できます。
3. preg_split() + PREG_SPLIT_NO_EMPTY:キーが振り直される
このフラグを付けると、空の文字列が最初から結果配列に含まれなくなるため、追加のフィルタ処理が不要になります。さらに、array_filter() とは異なりキーが0から順に振り直される点も大きな特徴です。
3つの方法の比較まとめ
| 方法 | 空要素の除去 | 「0」の扱い | 配列キー |
|---|---|---|---|
| array_filter() のみ | ◯ | 削除される | 元のキーを保持 |
| array_filter() + strlen | ◯ | 保持される | 元のキーを保持 |
| preg_split() + PREG_SPLIT_NO_EMPTY | ◯ | 保持される | 0から振り直し |
「0」を有効なデータとして扱いたい場合は、array_filter() に 'strlen' を渡すか、preg_split() の PREG_SPLIT_NO_EMPTY を使うのが安全です。特に結果のキーを連番(0始まり)に揃えたいケースでは、PREG_SPLIT_NO_EMPTY を利用するのが最もシンプルでおすすめです。
-
PHPのimagestringup()関数で画像に文字列を垂直に描画する方法
imagestringup()は、PHPのGDライブラリに組み込まれた関数の一つで、画像に対して文字列を垂直方向(下から上へ)に描画するために使用されます。通常の横書きテキストとは異なる縦向きのテキスト表現が必要な場面で活躍する便利な関数です。 構文 bool imagestringup ( $image, $font, $x, $y, $string, $color ) パラメータ imagestringup()関数は、以下の6つのパラメータを受け取ります。 $image − imagecreatetruecolor()関数などで作成した画像リソースを指定します。ここには、指定したサイズの
-
C#でListから空の文字列を削除する方法を解説
C#のList<string>に空の文字列が含まれている場合、それらを削除したい場面はよくあります。本記事では、RemoveAtメソッドを使って、インデックスを指定して空の文字列要素を削除する基本的な方法を解説します。空の文字列を含むリストを作成するまず、空の文字列を要素として持つリストを作成しましょう。List<string> myList = new List<string>() { , , };このリストには、空の文字列が3つ格納されています。RemoveAtメソッドで要素を削除するRemoveAtメソッドを使用すると、