2013-07-25 77 views
11

假設有一個字符串「foo boo foo boo」我想用boo和booo替換所有foo與foo。預期的輸出是「boo foo boo foo」。我得到的是「foo foo foo foo」。如何獲得預期的產出而不是現在的產出?交換一個字符串中的兩個字php

$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

從手冊:

如果給出了兩個argume nts,第二個應該是數組形式的數組('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

因此,所有項目都將是「富」? – Bora

+0

@Bora:不。所有'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」 不能發生在$ a

2

首先foozoo。然後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

如果在這個例子中是你的情況的順序,然後使用explodearray_reverse功能,可以很方便也:

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

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

//gives boo foo boo foo 

PS:可能不是m emory友好並且可能無法滿足替換的所有情況,但它只是滿足您提供的示例。 :)

相關問題