PHPのsplit関数

PHP September 8th, 2008

Ruby、Perl、Pythonのsplit関数の挙動をまとめたページをつらつらと読んでいたのだが、そういえばPHPはどうなっているか気になったのでちょっと試してみた。

まずPHPのsplit関数だが、マニュアルによれば

説明
array split ( string $pattern , string $string [, int $limit ] )

string を、正規表現によって配列に分割します。

となっている。つまり、splitの第一引数は正規表現しかない。

$str = "a,b,c";
print_r(split(",", $str));
/*当然下のようになる。
Array
(
    [0] => a
    [1] => b
    [2] => c
)
*/

$str = "a,,c,,";
print_r(split(",", $str));
/* 末尾の空要素は無視されない。
Array
(
    [0] => a
    [1] =>
    [2] => c
    [3] =>
    [4] =>
)
*/

$str = "";
print_r(split(",", $str));
/* 空文字を分割すると空の配列が返る
Array
(
    [0] =>
)
*/

$str = "";
print_r(split("", $str));
/*
分割パターンが空だとエラーになって実行できない。
*/

$str = "a:b;c.d";
print_r(split("\.", $str));
/* 文字列では指定できないので意地になってみる。
Array
(
    [0] => a:b;c
    [1] => d
)
*/

$str = "a:b;c.d";
print_r(split("[:;.]", $str));
/* 正規表現だから範囲指定で。
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
)
*/

$str = "a.b.c";
print_r(split("[.]", $str));
/* これも同じ。
Array
(
    [0] => a
    [1] => b
    [2] => c
)
*/

$str = "a;b;c";
print_r(split(":", $str));
/* どれにもマッチしない。
Array
(
    [0] => a;b;c
)
*/

と、まあここまではいい。正規表現なのか文字列なのか区別がないので、正規表現しか受け付けないという潔さも、まあいいだろう。文字列が使いたいならexplodeすればいいじゃない、と王妃もおっしゃってましたし。

ところが、納得できないのはこれだ。

$str = "a.b.c";
print_r(split(".", $str));
/* 全部空文字で返ってきたよ。。。
Array
(
    [0] =>
    [1] =>
    [2] =>
    [3] =>
    [4] =>
    [5] =>
)
*/

$ret = split(".", $str);
var_dump($ret);
/* 文字列だって言い張るんだよ。。。
array(6) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
  [4]=>
  string(0) ""
  [5]=>
  string(0) ""
}
*/

直感的には、空の配列かFALSEが返ってくるような気がするのだが、こういうことらしい。ううむ。

2 Responses to “PHPのsplit関数”

  1. アンチだけど擁護します Says:

    $str=”,,,,,”; split(”,”, $str);
    と同じものが返ってきているのなら、納得じゃないですか?
    Rubyがこの場合に空配列を返すのは末尾の空文字列の要素を削除するから(だと考えられる)なので PHPには当てはまらないし……。

  2. admin Says:

    アンチどころかPHPは生活の糧ですが、確かにそういわれてみると納得できますね。

Leave a Reply