2015-03-25 2 views
0

Я пытаюсь заменить «e» на «E» и «E» на «e» в строке, и кажется, что это работает неправильно. Я использую массив:Swap две строки с использованием массива PHP

$original = "e and E"; 
$swap = array(
    "E" => "e", 
    "e" => "E"); 

$edited= str_replace(array_keys($swap), array_values($swap), $original); 

echo $original. "<br>"; 
echo $edited; 

Он возвращает «E и E». Я хочу вернуть «E и e», вы можете мне помочь?

+0

Вы всегда будете иметь все 'é' так как это последняя замена. – AbraCadaver

+3

['strtr'] (http://php.net/strtr) выполняет только итерацию по входу при замене; и более удобен для спаривания букв подстановки. – mario

ответ

1

Хотя это gotcha, это ожидается поведение. Вы заменили все E на e, затем все e с E. Таким образом, результат E and E.

Вам необходимо сделать это за два прохода, использовать заполнитель или использовать strtr(). Как прокомментировал марио, соответствующая функция для своп строк strtr():

$edited = strtr($original, $swap); 
+1

Это лучше, чем мой ответ. – itchee

0

str_replace может принять массив, но он не работает, как вы ожидаете. Вы можете использовать его для замены, например, всех вхождений «e» с «E» и всех «a» с «A», но это делается последовательно и не в одно и то же время. Поэтому в вашем коде «e и E» сначала заменяется на «e и e», а затем на «E и E».

ли это вместо:

$original = "e and E"; 
$edited = str_replace("e", "#", $original); 
$edited = str_replace("E", "e", $edited); 
$edited = str_replace("#", "E", $edited); 
echo $original. "<br>"; 
echo $edited; 
+0

Как вы отметили сами, 'strtr()' является лучшим решением. Подумайте, что произойдет, если '$ original' имеет' # 'в нем? –

0

Вам нужно сделать два прохода, используя временные маркеры:

$original = "e and E"; 
$swap = array(
    "E" => "$", 
    "e" => "E", 
    "$" => 'e',  
); 

$edited= str_replace(array_keys($swap), array_values($swap), $original); 
echo $edited; 
+0

'strtr()' - лучшее решение. Подумайте, что произойдет, если '$ original' имеет' $ 'в нем? –

Смежные вопросы