web-dev-qa-db-ja.com

strtr vs str_replaceを使用する場合

strtrstr_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

構文とは別に、一方を他方よりも使用することに利点はありますか?希望する結果を得るのに十分ではない場合はありますか?

80
andrewtweber

最初の違い:

strtrstr_replaceの異なる動作の興味深い例は、PHP Manual:

<?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」を返します

つまり、str_replaceは置換に対するよりグローバルなアプローチであり、strtrは文字を1つずつ変換するだけです。


別の違い:

次のコードが与えられた場合( 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:Hypertext Preprocessor」。

    3. 探すキーはもうないので、置換はそこで終わります。

127

どちらの関数を使用してもまったく同じ結果を達成できる可能性があるようです

それは常に真実であるとは限らず、提供する検索および置換データに依存します。 2つの関数が異なる例については、以下を参照してください: PHP str_replaceには13文字を超える制限がありますか?

  • strtr は、すでに置換されている文字列の一部を置換しません- str_replace は、内部置換を置換します。
  • strtrは、2つのパラメーターで呼び出す場合、最初に最長のキーで始まります。str_replaceは左から右に置き換えます。
  • str_replaceは実行された置換の数を返すことができます-strtrはそのようなカウント値を提供しません。
18
hakre

strtrは、2つの引数と共に使用すると、より柔軟で条件付きの置換を提供すると思います。たとえば、stringが1の場合はaに、stringが10の場合はbに置き換えます。このトリックは、strtrによってのみ達成できました。

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

Php Manual Strtr を参照してください。

5
Arif RH

マニュアルSTRTRの注意-説明string strtr(string $ str、string $ from、string $ to)string strtr(string $ str、array $ replace_pairs)3つの引数が与えられた場合、この関数はcopyを返しますstrの...

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

STRTRはそれぞれ次の効果を無効にしますが、STR_REPLACEは有効です。

1
Null None