89

strtrいつが望ましいか、str_replaceまたはその逆が望ましいかを理解するのに苦労しています。部分文字列が置換される順序は逆になりますが、どちらの関数を使用してもまったく同じ結果を得ることができるようです。例えば:

echo strtr('test string', 'st', 'XY')."\n";
echo strtr('test string', array( 's' => 'X', 't' => 'Y', 'st' => 'Z' ))."\n";
echo str_replace(array('s', 't', 'st'), array('X', 'Y', 'Z'), 'test string')."\n";
echo str_replace(array('st', 't', 's'), array('Z', 'Y', 'X'), 'test string');

これは出力します

YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring

構文は別として、一方を他方よりも使用する利点はありますか? 目的の結果を達成するのに十分でない場合はありますか?

4

4 に答える 4

143

最初の違い:

strtrとの間の異なる動作の興味深い例はstr_replace、PHP マニュアルのコメント セクションにあります。

<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>
  • 私は結果として期待するでしょう:「ZDDB」
  • ただし、この戻り値: "ZDDD" (配列によると B = D であるため)

これを機能させるには、代わりに「strtr」を使用します。

<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>
  • これは次を返します:「ZDDB」

これは、単純に文字を 1 つずつ変換するstr_replace一方で、置換に対するよりグローバルなアプローチであることを意味します。strtr


別の違い:

次のコードが与えられた場合 ( PHP 文字列置換速度比較から取得):

<?php
$text = "PHP: Hypertext Preprocessor";

$text_strtr = strtr($text
    , array("PHP" => "PHP: Hypertext Preprocessor"
        , "PHP: Hypertext Preprocessor" => "PHP"));
$text_str_replace = str_replace(array("PHP", "PHP: Hypertext Preprocessor")
    , array("PHP: Hypertext Preprocessor", "PHP")
    , $text);
var_dump($text_strtr);
var_dump($text_str_replace);
?>

結果のテキスト行は次のようになります。

string(3) "PHP"
string(27) "PHP: ハイパーテキスト プリプロセッサ"


主な説明:

これは、次の理由で発生します。

  • strtr : パラメータを長さで降順でソートするため、次のようになります。

    1. 最大のものに「より重要性」を与え、次に、対象のテキスト自体が置換配列の最大のキーであるため、翻訳されます。
    2. 対象テキストのすべての文字が置き換えられているため、プロセスはそこで終了します。
  • str_replace : キーが定義されている順序で機能するため、次のようになります。

    1. 件名のテキストでキー「PHP」を見つけて、「PHP: Hypertext Preprocessor」に置き換えます。結果は次のとおりです。

      「PHP: ハイパーテキスト プリプロセッサ: ハイパーテキスト プリプロセッサ」。

    2. 次に、前のステップの結果のテキストで次のキー「PHP: Hypertext Preprocessor」を見つけるため、「PHP」に置き換えられ、結果として次のようになります。

      「PHP: ハイパーテキスト プリプロセッサ」。

    3. 探すキーはもうないので、交換はそこで終了します。

于 2011-11-18T03:26:15.450 に答える
7

strtrたとえば、文字列が 1 の場合は a に置き換え、文字列が 10 の場合は b に置き換えます。このトリックは によってのみ達成できstrtrます。

$string = "1.10.0001";  
echo strtr($string, array("1" => "a", "10" => "b"));  
// a.b.000a  

参照: Php マニュアル Strtr

于 2011-11-18T03:48:33.550 に答える
2

マニュアル STRTR の注意事項 -- 説明 string strtr ( string $str , string $from , string $to ) string strtr ( string $str , array $replace_pairs ) 3 つの引数を指定すると、この関数はstrのコピーを返します。

STR_REPLACE-- ... 検索または置換が配列の場合、それらの要素は最初から最後まで処理されます。...

STRTR の各ターンは次のターンには効果がありませんが、STR_REPLACE は効果があります。

于 2012-09-18T21:30:33.947 に答える