strtrとstr_replaceをいつ使用するのですか?


86

いつ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

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


3
読みやすさの観点からは、まったく異なるものstrtrとして簡単に誤読される可能性strstrがあります。私は失読症だと思い始めています。str_replaceでその間違いを犯すことはありません。
プログラマー

回答:


135

最初の違い:

間で異なる行動の興味深い例strtrとは、str_replacePHPマニュアルのコメント欄にあります。

<?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_replacestrtr、文字を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:ハイパーテキストプリプロセッサ」。

    3. 探すキーがなくなったので、交換はそこで終わります。


2
ああ、ありがとう!strtrが長さで翻訳されていることに気づかなかった-逆の順序だと思った。
andrewtweber 2011年

php.netに記載されているように、関数str_replaceには、置換を実行する回数を示す「count」という名前のパラメーターがもう1つあります。しかし、とにかくこのパラメータを使用することはできません。誰かが理由を知っていますか?
vantrung -cuncon 2012年

1
@ vantrung-cunconそれはそのパラメータの目的ではありません。ドキュメントには、「これは、実行された置換の数に設定されます」と書かれています。str_replaceを特定の量の置換に制限する場合は、別の解決策を見つける必要があります。
jdhartley 2012

1
頭字語の最初の出現を拡張バージョンに置き換える場合、つまり「WHO」の最初の出現を「WHO(世界保健機関)」に変更する場合は、置換の数を制限すると便利です。
のMichałTatarynowicz

strtr以前の置換によって挿入されたテキストは置換されません。strtr('foo', array('oo' => 'ie', 'e' => 't'))リターン'fie'の代わり'fit'としてstr_replace行います。したがって、@ Piesによって発生した問題に自動的に対処します。
デビッドハークネス2014年

21

どちらの機能でも全く同じ結果が得られるようです

これは常に正しいとは限らず、提供するデータの検索と置換によって異なります。たとえば、2つの関数が異なる場合は、次を参照してください。PHPstr_replaceには13文字を超える制限がありますか?

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

7

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

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

参照:Php ManualStrtr


2

手動STRTRの注意-説明stringstrtr(string $ str、string $ from、string $ to)string strtr(string $ str、array $ replace_pairs)3つの引数が与えられた場合、この関数はstrのコピーを返します。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.