2016-05-16 9 views
1

単語「私」を単語「あなた」に、単語「あなた」を単語「私」と同時に置き換える必要があります。 2つの単語が隣り合っていないときはstrtr()と一緒に動作しますが、そうであれば最初の単語を置き換えて2番目の単語を無視します。これを修正する方法はありますか?2つの単語を同時に置き換えてください。

<?php 

$string = "tell me you want to get it right"; 
$string = trim(strtr(" ".trim($string)." ", array(
" me " => " you ", 
" you " => " me " 
))); 

echo $string; 

?> 

実際の結果:

は私が右

それを取得したいあなたを教えて:

が右

結果必要あなたがそれを取得したいあなたを教えてPS:本当にどんな答えも必要ない"あなたは 'あなたと'124'とのすべてを置き換えるようなものを使用して、そしてすべて私は'1212 'と一緒に、あなたはすべて'1212'を '私'、そしてすべての'1212さん 'を'あなた 'と置き換えます。

+1

ための[役に立たないコメント]私は興味があります。これはちょうど学問的質問か、実際のユースケースですか? – Utkanos

答えて

2

配列での匿名関数の使用はどうですか?あなたが同時性をする理由無名関数を使用するために、任意の言い訳、私を幸せにする:)

$string = "tell me you want to get it right"; 
$string = implode(" ", array_map(function($word, $swap = ["me", "you"]) { 
    return ($index = array_search($word, $swap)) === false 
     ? $word : $swap[++$index % 2]; 
}, explode(" ", $string))); 
var_dump($string); 
/* string 'tell you me want to get it right' (length=32) */ 

以上の複雑な代替

$string = "tell me you want to get it right"; 
$replacements = ["me" => "you", "you" => "me", "right" => "wrong"]; 
$string = implode(" ", array_map(function($word) use($replacements) { 
    return isset($replacements[$word]) ? $replacements[$word] : $word; 
}, explode(" ", $string))); 
var_dump($string); 
/* string 'tell you me want to get it wrong' (length=32) */ 
+0

オハイオ州!これは最高です。完全な機能。私は間違いなく、無名関数を調べる必要があります。彼らは本当に役に立つようです。 – frosty

2

単語が連続しているかどうかにかかわらず、これは動作するようです。

$str = "foo something bar"; 
echo preg_replace_callback(
    '/\b(foo|bar)\b/', 
    function($match) { return $match[0] == 'foo' ? 'bar' : 'foo'; }, 
    $str 
); 

それは本当に同時ではありません。コールバックはマッチをループします。ただし、置き換えは、元の文字列で行われるように見えますが、各コールバックの後で更新される一時的な文字列ではなく(あなたの「あなた」の例は避けてください)、基本的には同じです。

+0

これをstrtr()関数のようなものに変換する方法はありますか?一度に複数の単語を置き換えることができますか?これは、一度に1つの単語に対してのみ機能するようです。 – frosty

+0

また、2つの単語が隣り合っているかどうかを質問していたので、私は好奇心が強いです。うまくいきません。しかし、あなたの例は、お互いの正反対にある2つの言葉を使います。 – frosty

+0

メカニックはよく分かりませんが、隣同士であるかどうかに関係なく動作しているようです。これは、おそらく 'strtr'で見つかった問題につながる繰り返しの更新された文字列ではなく、メモリに保存されている元の文字列の一時的なバージョンで置換が行われたことを意味します。 – Utkanos

0

これは、(理由は安いトリックの使用で、何らかの方法で)ちょっとある

はすべてを交換しyou1234「あなたがい 『』、その後、すべての」私 『はme1234』

答えてます...しかし、それは動作するはずです。関数、文字列、置換(連想)配列は引数です。同時に複数の置換を行う必要があります。文字列の位置は問題ではありません。

function replace_sim($str, $replace) { 

    $arr = str_word_count($str, 1); 
    $keys = array(); 
    $real_val = array(); 
    for ($i = 0; $i < count($arr); $i++) { 

    foreach($replace as $key => $value) { 
     if ($arr[$i] == $key) { 
     $arr[$i] = strrev($value); 

     $keys[] = $i; 
     $real_val[] = $value; 
     } 
    } 

    } 
    $i = -1; 
    foreach($keys as $key) { 
    $i++; 
    $arr[$key] = $real_val[$i]; 
    } 

    $str = join(' ', $arr); 
    return $str; 
} 

//usage 
$string = "tell me you want to you get it right me you"; 
$replace=array('me'=>'you','you'=>'me','get'=>'it','it'=>'get'); 
echo replace_sim($string,$replace); 

echo '<br>'; 

$string = "tell me i want you"; 
$replace=array('me'=>'you','you'=>'me'); 
echo replace_sim($string,$replace); 
関連する問題