php explodeを使用して文字列を分割する初心者が無視しやすい問題


1.explodeメソッドの説明
explodeメソッドでは、ある文字列を境界点として配列に分割できます.
array explode ( string $delimiter , string $string [, int $limit ] )

文字列からなる配列を返します.各要素はstringのサブ列で、文字列delimiterによって境界点として分割されます.
パラメータの説明:delimiter境界の区切り文字.
string入力文字列
limit limitパラメータが設定され、正数である場合、返される配列にはlimit要素が最大で含まれ、最後にその要素にはstringの残りの部分が含まれます.limitパラメータが負の場合、最後の-limit要素を除くすべての要素が返されます.limitが0の場合、1とみなされます.
2.例
使用、文字列の分割
<?php $str = '1,2,3,4,5,6,7,8,9'; $arr = explode(',', $str); echo '<pre>'; print_r($arr); echo '</pre>'; ?>

出力:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
)

使用、文字列の分割、limitを正数にする
<?php $str = '1,2,3,4,5,6,7,8,9'; $arr = explode(',', $str, 5); echo '<pre>'; print_r($arr); echo '</pre>'; ?>

出力:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5,6,7,8,9
)

使用、文字列の分割、limitが負の数
<?php $str = '1,2,3,4,5,6,7,8,9'; $arr = explode(',', $str, -3); echo '<pre>'; print_r($arr); echo '</pre>'; ?>

出力:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)

使用、文字列の分割、limit 0
<?php $str = '1,2,3,4,5,6,7,8,9'; $arr = explode(',', $str,0); echo '<pre>'; print_r($arr); echo '</pre>'; ?>

出力:
Array
(
    [0] => 1,2,3,4,5,6,7,8,9
)

3.見落としがちな問題
一般的にexplodeを使用してid文字列などのデータを分割します
<?php $ids = '1,2,3,4'; $data = explode(',', $ids); if($data){ foreach($data as $k=>$v){ // do sth } } ?>

通常idsは空ではなく、コードを見ても何の問題も発見されません.if(data)が判断されているからです.空の処理をしたと思われる.しかし、実際にはids=nullであり、dataは空ではなく、foreachで実行されるコードに問題が発生します.
<?php $ids = null; $data = explode(',', $ids); if($data){ print_r($data); }else{ echo 'null'; } ?>

ids=nullのためexplode分割を用い,得られた配列はArray([0]=>)ではなくArray()である.
だから判断は修正してこそ問題を避けることができる.
<?php $ids = null; $data = explode(',', $ids); if(isset($data[0]) && $data[0]){ foreach($data as $k=>$v){ // do sth } } ?>