2013-07-25 7 views
11

文字列「foo boo foo boo」があると仮定します。すべてのfooをbooとbooesでfooに置き換えたいとします。期待される出力は "boo foo boo foo"です。私が得るのは "foo foo foo foo"です。どのように現在の出力よりもむしろ期待される出力を得るか?文字列の2つの単語を交換する

$a = "foo boo foo boo"; 
    echo "$a\n"; 
    $b = str_replace(array("foo", "boo"), array("boo", "foo"), $a); 
    echo "$b\n"; 
    //expected: "boo foo boo foo" 
    //outputs "foo foo foo foo" 

答えて

23

使用strtr

もし与えられた2 argume ntsの場合、2番目の配列は配列array( 'from' => '〜'、...)の配列でなければなりません。戻り値は、配列キーのすべての出現箇所が対応する値に置き換えられた文字列です。最も長いキーが最初に試されます。部分文字列が置換されると、その新しい値は再び検索されません。

この場合、空のキーがない限り、キーと値の長さは任意です。追加的に、戻り値の長さはstrの長さと異なる場合があります。ただし、この機能はすべてのキーが同じサイズのときに最も効率的です。

$a = "foo boo foo boo"; 
echo "$a\n"; 
$b = strtr($a, array("foo"=>"boo", "boo"=>"foo")); 
echo "$b\n"; 

出力

foo boo foo boo 
boo foo boo foo 

In Action

+2

+1。感謝した 'strtr'、ありがとう! – Fallen

+0

結果として、すべてのアイテムは "foo"になりますか? – Bora

+0

@Bora:nope。すべての 'foo'は' boo'に置き換えられます。逆の場合は... – Fallen

3

おそらくここcoo.

サンプルコードのような一時的な値を使用して、手動から

$a = "foo boo foo boo"; 
echo "$a\n"; 
$b = str_replace("foo","coo",$a); 
$b = str_replace("boo","foo",$b); 
$b = str_replace("coo","boo",$b); 
echo "$b\n"; 
0
$a = "foo boo foo boo"; 
echo "$a\n"; 
$a = str_replace("foo", "x", $a); 
$a = str_replace("boo", "foo", $a); 
$a = str_replace("x", "boo", $a); 
echo "$a\n"; 

"x" は$でzoo

2

まずfooを発生しないことに注意してください。あなたのケースの順序で、この例のように、その後にも便利ですexplodearray_reverse機能を使用している場合、boofooに、最後のzooboo

$search = array('foo', 'boo', 'zoo'); 
$replace = array('zoo', 'foo', 'boo'); 
echo str_replace($search, $replace, $string); 
0

にそれを

$a = "foo boo foo boo"; 
echo "$a\n"; 
$b = str_replace(array("foo", "boo","[anything]"), array("[anything]", "foo","boo"), $a); 
echo "$b\n"; 
1

をお試しください:

//the original string 
$a = "foo boo foo boo"; 

//explodes+reverse+implode 
$reversed_a = implode(' ', array_reverse(explode(' ', $a))); 

//gives boo foo boo foo 

PS:友好的ではありませんが、交換の場合はすべてを満たしているわけではありません。 :)

関連する問題