【PHP】空文字が1つ入った配列が返される、explode関数の危険な仕様

プログラミング

どうも、コウイチです。

今回は、PHPのexplode関数について、ハマったのでメモします。

思い込みでコーディングしてると、恐ろしいバグに出会ってしまいますね(;゚Д゚)

そもそも、explode関数とは何か?から見ていきましょう。

explode関数とは

explode関数とは、指定した区切り文字で、文字列を区切り、配列として返します。

今回は、カンマで文字列を分割してみます。

<?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] => みかん
)
うむ。納得の結果です。

explode関数の危険な仕様

それでは次に、危険な仕様を再現します。

$str変数を空っぽにして試してみましょう。

<?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] =>
)
コウイチ

フルーツの数が1種類!?こいつは何を言っているんだ?

どうみても空っぽだろ。

要素数0の空の配列が返されると思っていた僕の頭の中はパニック状態に。

得体のしれないフルーツの正体

この、得体のしれない1種類の要素は何者なのでしょうか。

 

格闘すること数分。

 

どうやら、何もない要素が1つある配列が返されたようです。

 

なんとも奇妙な仕様でしょうか?

 

解決案

解決案ですが、$str変数が空の可能性がある場合は、条件分岐して対応した方がよさそうです。

<?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種類です。

まとめ

思い込みでハマらないように、気を付けたいものです。

参考になれば幸いです。

コメント