これ何て呼びますか

PHPのpreg_split第3引数で理解できない挙動になることがあるのですが…

第3引数
・区切り文字で分割できる数以上の数を指定した場合の挙動は、分割できる最大数で分割されるとは限らないのですか?


Q
下記の「b_0」「b_3」「b_4」は、それぞれどういう理由で下記結果となるのですか?


-------

前提
$str='zwed_fgrty_abcde_h';

-------

理解できる挙動例 a_6
$ra_6 = preg_split('/_/', $str, 6);
var_dump($ra_6);
array(4) {
__[0]=> string(4) "zwed"
__[1]=> string(5) "fgrty"
__[2]=> string(5) "abcde"
__[3]=> string(1) "h"
}

-------

理解できる挙動例 b_1
$b_1 = preg_split('/_[^_]+/', $str, 1);
var_dump($b_1);
array(1) {
__[0]=> string(18) "zwed_fgrty_abcde_h"
}

-------

理解できる挙動例 b_2
$b_2 = preg_split('/_[^_]+/', $str, 2);
var_dump($b_2);
array(2) {
__[0]=> string(4) "zwed"
__[1]=> string(8) "_abcde_h"
}

-------

理解できない挙動例 b_0
$b_0 = preg_split('/_[^_]+/', $str, 0);
var_dump($b_0);
array(4) {
__[0]=> string(4) "zwed"
__[1]=> string(0) ""
__[2]=> string(0) ""
__[3]=> string(0) ""
}

-------

理解できない挙動例 b_3
$b_3 = preg_split('/_[^_]+/', $str, 3);
var_dump($b_3);
array(3) {
__[0]=> string(4) "zwed"
__[1]=> string(0) ""
__[2]=> string(2) "_h"
}

-------
理解できない挙動例 b_4
$b_4 = preg_split('/_[^_]+/', $str, 4);
var_dump($b_4);
array(4) {
__[0]=> string(4) "zwed"
__[1]=> string(0) ""
__[2]=> string(0) ""
__[3]=> string(0) ""
}

A 回答 (3件)

zwed_fgrty_abcde_h


b_0は、最初のセパレーター _fgrty 次のセパレーター _abcde 3つ目のセパレーター _h で、それぞれのセパレーターに挟まれたのは、
zwed と 空文字列 3つです

b_3は、3つに分割するのでセパレーターは2つまで使います。b_0との違いは _h がセパレーターに選ばれないので、挟まれたのは、
zwed 、空文字列、_h です

b_4は、b_0と同じ。

考え方としては、
『セパレーターにマッチするもののうち、先頭から「第3引数-1」個だけを使って、文字列を分割』
ということです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
内容難しかったですが、分かったような気がします。

・セパレーターにマッチするもののうち、先頭から「第3引数-1」個までを使って、文字列を分割。※0は意味が異なるのでこれには該当しない
・セパレータの間がない場合は、空文字になる
ということだと理解しました

お礼日時:2020/01/02 09:38

これが理解しにくいのは、


正規表現で定義されたセパレーターが
実際のセパレートの際にどんな文字列だったのか
表示されていないからですね。

以下のような感じだったら
秒で理解できたのでしょう。
説明が下手でした。
もっと勉強します。

コード:
<?php
$string='000_111_222_333_444_555_666_777_888_999';
$array=preg_split('/_[^_]+/',$string,5);
print_r($array);
?>

結果:
array of 1 : 000
separate1 : _111
array of 2 :
separate2 : _222
array of 3 :
separate3 : _333
array of 4 :
separate4 : _444
array of 5 : _555_666_777_888_999
    • good
    • 1
この回答へのお礼

再度の回答ありがとうございました。

>説明が下手でした
・とんでもないです
・わざわざコード作成いただきありがとうございます

>第3引数を1から順に増やしていくと分かりやすい
・「この文」を読んで、「単純なコード例を作成して一つ一つ順を追って地道に確認していくこと」がやはり重要なのだな、と改めて思いました

お礼日時:2020/01/03 07:53

テスト用の文字列が短いからわかりにくいのだと思います。



Geeksforgeeks IDE
https://ide.geeksforgeeks.org/r9Z1bCW5tl

コード:
<?php
// Your code here!
$string='000_111_222_333_444_555_666_777_888_999';
$array=preg_split('/_[^_]+/',$string,5);
print_r($array);
?>

結果:
Array
(
[0] => 000
[1] =>
[2] =>
[3] =>
[4] => _555_666_777_888_999
)

第3引数を1から順に増やしていくと
分かりやすいので
試してみてください。
    • good
    • 1
この回答へのお礼

「回答」&「具体例作成」&「リンク提示」ありがとうございました。

>第3引数を1から順に増やしていくと分かりやすいので試してみてください
・試してみました
・質問時点では空文字になる意味が分からなかったのですが、No.1さんの回答を読んで「最初のセパレーター」「次のセパレーター」と、一つ一つ順を追って確認していき、リンク先コードを動かしていくと理解できました

お礼日時:2020/01/02 09:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!