裏表(Phinloda のもう裏だか表だか分からないページ)

コンピュータ・プログラミング系の話がメインのそれなりにごちゃごちゃしたネタばかり出てくるサイトです。多分。
<< ノートpcの左側のヒンジあたりが不安定になってきたのだが | Top | Eclipse がうまく動かないのだが >>
PHP で rtrim を使って文字列の最後のカンマを取り除く

ループ中に出現した string をカンマで区切って並べたいときに、 出てきた string の最後に「,」を付けてつなげていくと、 最後の string の後にもカンマが付くから「a,b,c,」のようになる。 この最後のカンマを付けないようにするのが面倒だ。

これはいちいち最後かどうか判定したり、 最初以外はカンマを付けるといった処理を最初にもってきたり、 そのような単純な考え方をするよりも、 とりあえず最後までカンマを付けておいて、最後にそれをカットするのが案外楽である。

このときに、PHP だと rtrim という関数が使える。 trim というのは他の言語にも出てくるが、PHP の rtrim は、対象となる文字を指定できるから便利で、つまり、カンマを指定すればカンマを最後から除去してくれるのだ。 こんな感じに書けばいい。

$str = rtrim($str, ",");

ところで、ググってみると、rtrim を使う他に、substr を使う流儀が多く見られた。 削除対象の文字が指定できるようになったのはバージョン 4.1.0 なので、それ以前の PHP では使えなかったのだ。 次のような処理になる。

$str = substr($str, 0, -1);

これでいいのだろうか。 もちろん、これは文字列の最後の1文字を取り除いた部分文字列を返すから問題ない…ように見える。 しかし、PHP のマニュアルにはこんなことが書いてある。

最低 1 文字以上を指定しなければなりません。

長さ0の string に対して substr を実行するのは仕様に反するのだ。 しかし、実際にループの中でカンマを付ける処理を作ると、

$str = "";
if (hoge()) {
    $str .= getString();
    $str .= ",";
}

このような処理の場合、1度も実行されずにループが終わってしまい、文字列の長さが0になってしまうこともなくはない。 では、この場合、substr の処理は一体どうなるのだろうか?

手元の環境で実行してみたが、特に何も起こらなかった。 つまり、substr("", 0, -1); は、何事もないかのごとく "" を返してくれた。 とはいっても、仕様的にはマズいので、事前に長さが1以上であることを調べたりすべきなのだが、だったら最初からそんな制限のない rtrim を使った方がお手軽な訳である。

JUGEMテーマ:コンピュータ
| PHP | 22:11 | comments(4) | trackbacks(0)
スポンサーサイト
| - | 22:11 | - | -
コメント
管理者の承認待ちコメントです。
| - | 2014/08/02 9:29 AM |
管理者の承認待ちコメントです。
| - | 2015/04/13 4:44 PM |
管理者の承認待ちコメントです。
| - | 2015/04/17 12:35 PM |
管理者の承認待ちコメントです。
| - | 2015/04/18 1:40 PM |
コメントする









この記事のトラックバックURL
http://phinloda.jugem.cc/trackback/3455
トラックバック
Powered by "JUGEM"
▲このページの先頭へ
CALENDAR
S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< July 2018 >>
NEW ENTRIES
CATEGORIES
ARCHIVES
NEW COMMENTS
NEW TRACKBACKS
LINKS
PROFILE