PHPの関数 str_replace
で配列を使用する際に、いくつかの問題があります。
こんなメッセージが出ます。
$message = strtolower("L rzzo rwldd ty esp mtdsza'd szdepw ty esp opgtw'd dple");
そして、str_replace
を次のように使おうとしています。
$new_message = str_replace(
array('l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','a','b','c','d','e','f','g','h','i','j','k'),
array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'),
$message);
結果は A good glass in the bishop's hostel in the devil's seat
となるはずですが、代わりに p voos vlpss xn twt qxswop's wosttl xn twt stvxl's stpt
となってしまいます。
しかし、2文字だけを置き換えようとすると、うまく置き換えることができます。
$new_message = str_replace(array('l','p'), array('a','e'), $message);
文字 l
と p
は a
と e
に置き換えられます。
アルファベットの配列が両方とも全く同じ大きさなのに、なぜフルアルファベットの配列では動作しないのでしょうか?
str_replace()は左から右への置換を行うため、複数回の置換を行う際に前に挿入された値を置換してしまうことがあります。
// AがBに置き換えられ、次にBがCに置き換えられ、...となるのでFを出力します。 // 左から右への置換のため、最後にEがFに置換されます。 $search = array('A', 'B', 'C', 'D', 'E'); $replace = array('B', 'C', 'D', 'E', 'F'); $subject = 'A'。 echo str_replace($search, $replace, $subject);
配列を使った str_replace` は、すべての置換を順番に行うだけです。代わりに strtr` を使うと、すべての置換を一度に行うことができます。
$new_message = strtr($message, 'lmnopq...', 'abcdef...');
簡単で、str_replace
よりも優れています。
<?php
$arr = array(
"http://" => "http://www.",
"w" => "W",
"d" => "D");
$word = "http://desiweb.ir";
echo strtr($word,$arr);
?>
strtr
PHP doc ここ