fetus Diary

twitter: @fetus_hina / Twilog
ポプともID: 4174-5004-0070 (チャレ/最高38/安定34)
IIDX ID: 3604-3873 (SP六段底辺)

2009/05/10(日) - php の str_replace

昔っから気になってて、mb_str_replace は実際にそれを無視して実装しているわけだけども、

<?php
    $table1 = array('a' => 'b', 'b' => 'c');
    $table2 = array_reverse($table1);
    $subject = 'abc';

    printf("1: %s\n", str_replace(array_keys($table1), array_values($table1), $subject));
    printf("2: %s\n", str_replace(array_keys($table2), array_values($table2), $subject));
?>

こういうコードで、

1: ccc
2: bcc

こういう結果になるのは納得できないよなぁ…。

str_replace 関数をこういう呼び出し方をしたプログラマは、どっちも "bcc" になって欲しいんだと思うの。

PHP がこういう挙動を示す理由はおそらくこういうこと、というのはこのへんに書いておいた。

上のコードで 1 と 2 の結果が違う理由は「置換順」。

1 は「abc」→("a" を "b" に置換)→「bbc」→("b" を "c" に置換)→「ccc」。

2 は「abc」→("b" を "c" に置換)→「acc」→("a" を "b" に置換)→「bcc」。

私が本来あるべきと考える手順は「abc」→("a" を "b" に、"b" を "c" に置換。一度触った部分は二度と触らない)→「bcc」なので、2 とも違う。

# "c を a に置換" というルールを加えると全然違う結果になる。それぞれ "aaa"、"bcb"、"bca"。

関係あるかも?

このエントリは次のエントリから参照されているみたいです

コメント

コメントはありません。

名前
メール
コメント

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

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