2016-06-01 2 views
4

Я хочу написать функцию, которая позволяет мне заменять повторения токена в строке с необходимыми значениями из массива, так что WHERE name = ? and age ?, array('joe', 32) становится Where name = joe and age = 32. (Я знаю, что привязка переменных не должна выполняться «вручную», я пытаюсь устранить аргументы, переданные в красноречивый DB::select).Что особенного в `str_replace`?

Я написал:

function str_replace_array($search, array $replace, $subject) { 
    foreach ($replace as $replacement) { 
     $subject = str_replace($search, $replacement,$subject,1); 
    } 
    return $subject; 
} 

Но PHP 5.6.20 дает мне эту ошибку:

$ php -l str_replace_array.php 
PHP Fatal error: Only variables can be passed by reference in str_replace_array.php on line 5 
Errors parsing str_replace_array.php 

Я знаю, что это функция str_replace(), потому что заменив его фиктивным функции позволяет передавать проверка синтаксиса. Хотя, ни одна из них не имеет той же переменной, что и у правопреемника и аргумента, - но есть ли что-нибудь, чтобы указать, что это не будет работать в этой функции?

manual entry не указывает, что любые аргументы передаются по ссылке; он указывает возвращаемое значение, и все примеры показывают назначение.

Что это такое?

ответ

1

Последний параметр str_replace принимает varible, чтобы сэкономить счет, а не производить замену n раз;

использование preg_replace

function str_replace_array($search, $replace, $subject) { 
    foreach ($replace as $replacement) { 
     $subject = preg_replace("/\?/", $replacement,$subject, 1); 
    } 
    return $subject; 
} 
echo (str_replace_array("?",array(1,2,3),"awdwad ? asdaw ? awdwa? awd")); 

результат: "awdwad 1 asdaw 2 awdwa3 AWD"

+0

с preg_quote fuction вы все равно можете пройти $ search. –

4

Его из-за последний параметр str_replace (mixed $search , mixed $replace , mixed $subject [, int &$count ]), что вы устанавливаете непосредственно 1, необходимо установить, что в некоторых переменном сказать $count, так как его значение будет установлено на количество замен в исполнении. Поэтому измените на:

.. 
$subject = str_replace($search, $replacement,$subject, $count); 
.. 
+0

О Sheesh - есть способ ограничить количество замен это делает? – user151841

+1

@ user151841 ну, вы не можете сделать это с помощью str_replace, вам придется написать какую-то пользовательскую функцию для ограничения str_replace –

+0

Похоже, что 'preg_replace()' является ответом http://stackoverflow.com/questions/1252693/using -str-replace-so-that-it-only-act-on-the-first-match – user151841

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