Переключать текст с помощью str_replace и массивов - PullRequest
3 голосов
/ 10 декабря 2011

Вот кое-что интересное, что я только что узнал о str_replace ().В моей функции мне нужно сделать два одинаковых запроса MySQL с небольшим изменением в сортировке результата.В качестве аргумента я получаю строку, содержащую предложение, например, «фамилия ASC», но это может быть и «фамилия DESC».Теперь я хотел легко переключиться на обратную сортировку, используя str_replace, и я подумал, что это должно сработать:

str_replace(array('ASC', 'DESC'), array('DESC', 'ASC'), $subject)

На мой взгляд, это должно изменить все вхождения ASC с DESC и все вхождения DESC с ASC.Поскольку строка содержит только одну из двух, я должен получить предложение в обратном порядке.Однако, это не так.Вывод приведенного выше кода является той же строкой.

Я провел некоторое тестирование, и выяснилось, что эти вызовы делают то, что вы от них хотите:

str_replace('ASC', 'DESC', $subject)
str_replace(array('ASC'), array('DESC'), $subject)

По-моему, это странно, потому что

array('ASC', 'DESC') != array('DESC', 'ASC')

Почему тогда PHP будет считать это равным?Есть ли другой способ сделать этот вид замены легко?

Ответы [ 3 ]

4 голосов
/ 10 декабря 2011

В этом сценарии вы можете использовать strtr примерно так:

strtr($subject, array('ASC' => 'DESC', 'DESC' => 'ASC'));

Это будет работать, потому что

Если дано два аргумента, вторым должен быть массив в виде array('from' => 'to', ...). Возвращаемое значение представляет собой строку, где все вхождения ключей массива были заменены соответствующими ценности. Самые длинные ключи будут опробованы первыми. Как только подстрока заменено, его новое значение больше не будет искать.

увидеть его в действии .

Что касается str_replace, то, как вы уже выяснили, происходит то, что сначала ASC заменяется на DESC, а затем DESC заменяется обратно на ASC, что в целом ничего не делает.

3 голосов
/ 10 декабря 2011

PHP сначала «рендерит» первый параметр, изменяя все вхождения так, как вы хотите (все ASC установлены на DESC).

Но затем вы передаете второй параметр, говорящий об обратном, поэтому все DESC s установлены на ASC, в основном обнуляя ваш первый параметр.

0 голосов
/ 10 декабря 2011

На самом деле, я просто догадываюсь: замены последовательные. Это означает, что сначала он заменяет ASC на DESC, а затем DESC на ASC, что снова приводит к той же строке.

Обновление: похоже, я прав

php > $a = 'I am a string';
php > var_dump(str_replace(array('am', 'is'), array('is', 'k'), $a));
string(12) "I k a string"

Сначала он заменяет am на is (первая запись), а затем is на k

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...