2011-12-09 1 views
3

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

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

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

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

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

На мой взгляд, это странно, потому что

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

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

ответ

4

В этом случае, вы можете использовать strtr так:

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

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

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

See it in action.

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

0

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

Update: Кажется, я прав

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

3

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

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

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