explodeとimplodeの実務テクニック
explode とは文字列を区切りで配列に分ける関数、implode とは配列を区切りでつないで文字列にする関数です。文字列と配列を行き来する定番の組です。
基本と、引数の順番の混乱
文字列を区切りで分けるのが explode、配列を連結するのが implode です。私がいまだにたまに迷うのが引数の順番で、explode は「区切り文字, 対象文字列」、implode は「区切り文字, 配列」です。implode は歴史的に引数を逆に書いても動きましたが、今のバージョンでは非推奨なので素直に「区切り, 配列」で書くのが安心です。
$csv = 'apple,banana,cherry';
$arr = explode(',', $csv);
// ['apple', 'banana', 'cherry']
echo implode(' / ', $arr);
// "apple / banana / cherry"
explodeの第3引数limit
explode には第3引数 limit があって、これが意外と便利です。正の値を渡すと、その個数まで分割して残りは最後の要素にまとめて入れます。「キー=値」の値側に区切り文字が含まれるケースで役立ちます。負の値を渡すと末尾からその個数を捨てる、という挙動になります。
$line = 'key=a=b=c';
// limit 2: 最初の = だけで割る
$pair = explode('=', $line, 2);
// ['key', 'a=b=c']
// 負の limit: 末尾を1つ落とす
$parts = explode(',', 'x,y,z', -1);
// ['x', 'y']
ログ行や URL のパースで「先頭だけ切りたい」場面は多いので、limit 2 は覚えておくと出番が多いと思います。
空文字を分割したときの罠
ハマりやすいのが空文字を explode したときの挙動です。空文字を渡しても空配列ではなく、空文字1個を含む配列 [''] が返ります。要素数を数える処理で「0件のはずが1件になる」ズレが出るので、事前に空判定するか、結果を array_filter で掃除するのが安全ですね。
var_dump(explode(',', ''));
// [0 => ''] 空配列ではない点に注意
// 空要素を落としたいとき
$tags = 'php,,mysql,';
$clean = array_filter(explode(',', $tags), 'strlen');
// 'php' と 'mysql' が残る(値が空のものを除去)
ちなみに区切り文字に空文字を渡すとエラーになります。一文字ずつ分けたいときは explode ではなく str_split や mb_str_split を使う、という切り分けですね。
まとめ
explode と implode は日常的に使う関数ですが、limit 引数を使いこなすと「先頭だけ割る」「末尾を捨てる」といった小回りが利きます。空文字を割ると空配列にならないこと、空要素の掃除には array_filter が便利なこと、この2点を押さえておくとカウントずれのバグを避けられると思います。
よくある質問
Q. 引数の順番はどちらでしたか?
A. explode は「区切り文字, 対象文字列」、implode は「区切り文字, 配列」です。implode を逆順に書くのは今は非推奨なので、素直にこの順で書きます。
Q. 先頭だけで区切りたいです。
A. explode の第3引数 limit に 2 を渡すと、最初の区切りだけで分割し、残りは最後の要素にまとめてくれます。
Q. 空文字を explode するとどうなりますか?
A. 空配列ではなく、空文字1個を含む [''] が返ります。件数がずれやすいので、事前に空判定するか array_filter で掃除すると安全です。