fetus Diary

2008/09/10(水) - 遠く遠くからネタを拾ってくる

PHPのsplit関数 | Selfkleptomaniac

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

$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が返ってくるような気がするのだが、こういうことらしい。ううむ。

むしろ今の PHP の実装通りにならないと困るっていうか、PHP がバカ正直というか…。

split の第一引数は正規表現だから "." だと「すべての文字でマッチング」になる。

'a/b/c' に対して '/' で split した場合に array('a', 'b', 'c') になるように、'/' はどこにも残らない。正規表現にマッチした前後で切り出すわけだから当たり前だけど。じゃあ、'.' で split をかけるとどうなるかというと全部の文字にマッチングするから 『<ここ>a<ここ>.<ここ>b<ここ>.<ここ>c<ここ>』…の<ここ>の部分が切り出され、それぞれ該当する部分は長さ 0 の文字列でなければならない。

つまり、要素数 6 ですべての要素が空文字列の配列ができるのは正常…に思えるんだけど……私なんか間違ってるんだろうか。

# そもそも第一引数に "." なんて指定する意味がないからしないけど。というか、個人的には単純なものは explode、複雑なものは preg_split 呼ぶから split に出番は無い…

コメント

コメントはありません。

名前
メール
コメント

※HTML タグは使えません。HTTP URL には自動リンクが張られます。

Captcha
画像から読み取れる文字を入力: