Поменять местами две строки, используя массив PHP

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

$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;

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


person Razvan Cuceu    schedule 25.03.2015    source источник
comment
У вас всегда будут все E, так как это последняя замена.   -  person AbraCadaver    schedule 25.03.2015
comment
strtr перебирает ввод только один раз при замене; и более удобен для парных замещающих букв.   -  person mario    schedule 25.03.2015


Ответы (3)


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

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

$edited = strtr($original, $swap);
person Jason McCreary    schedule 25.03.2015
comment
Это лучше, чем мой ответ. - person itchee; 25.03.2015

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;
person itchee    schedule 25.03.2015
comment
Как вы сами заметили, strtr() - лучшее решение. Подумайте, что произойдет, если в $original будет #? - person Jason McCreary; 25.03.2015

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

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

$edited= str_replace(array_keys($swap), array_values($swap), $original);
echo $edited;
person Steve    schedule 25.03.2015
comment
strtr() - лучшее решение. Подумайте, что произойдет, если в $original будет $? - person Jason McCreary; 25.03.2015