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"。
関係あるかも?
このエントリは次のエントリから参照されているみたいです
- 2009/12/31(木) - HiNa - 2009年記事ランキング
コメント
コメントはありません。