どうも、コウイチです。
今回は、PHPのexplode関数について、ハマったのでメモします。
思い込みでコーディングしてると、恐ろしいバグに出会ってしまいますね(;゚Д゚)
そもそも、explode関数とは何か?から見ていきましょう。
explode関数とは
explode関数とは、指定した区切り文字で、文字列を区切り、配列として返します。
今回は、カンマで文字列を分割してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // 【PHP】空文字が1つ入った配列が返される、explode関数の危険な仕様 $str = 'りんご,バナナ,いちご,メロン,みかん'; $fruits_array = explode(',', $str); print 'フルーツは' . count($fruits_array). '種類です。<br>'; echo '<pre>'; print_r($fruits_array); echo '</pre>'; ?> |
実行結果
フルーツは5種類です。
Array
(
[0] => りんご
[1] => バナナ
[2] => いちご
[3] => メロン
[4] => みかん
)
(
[0] => りんご
[1] => バナナ
[2] => いちご
[3] => メロン
[4] => みかん
)
うむ。納得の結果です。
explode関数の危険な仕様
それでは次に、危険な仕様を再現します。
$str変数を空っぽにして試してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // 【PHP】空文字が1つ入った配列が返される、explode関数の危険な仕様 $str = ''; $fruits_array = explode(',', $str); print 'フルーツは' . count($fruits_array). '種類です。<br>'; echo '<pre>'; print_r($fruits_array); echo '</pre>'; ?> |
どうなると思いますか?
僕の予想では、空の配列が返されると思ってました。当然ですよね・・・?
実行結果
フルーツは1種類です。
Array
(
[0] =>
)
Array
(
[0] =>
)
コウイチ
フルーツの数が1種類!?こいつは何を言っているんだ?
どうみても空っぽだろ。
要素数0の空の配列が返されると思っていた僕の頭の中はパニック状態に。
得体のしれないフルーツの正体
この、得体のしれない1種類の要素は何者なのでしょうか。
格闘すること数分。
どうやら、何もない要素が1つある配列が返されたようです。
なんとも奇妙な仕様でしょうか?
解決案
解決案ですが、$str変数が空の可能性がある場合は、条件分岐して対応した方がよさそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php // 【PHP】空文字が1つ入った配列が返される、explode関数の危険な仕様 $str = ''; if(empty($str)){ // 空の場合 print 'フルーツは0種類です。<br>'; }else{ // 空でない場合 $fruits_array = explode(',', $str); print 'フルーツは' . count($fruits_array). '種類です。<br>'; echo '<pre>'; print_r($fruits_array); echo '</pre>'; } ?> |
実行結果
フルーツは0種類です。
まとめ
思い込みでハマらないように、気を付けたいものです。
参考になれば幸いです。
コメント