如果使用str_replace
與針陣列代替3,每針被替換在一個單獨的呼叫str_replace
。你能想象這樣的事情在內部發生:
for ($i=0, $n=min(count($pattern),count($change)); $i<$n; $i++) {
$sql = str_replace($pattern[$i], $change[$i], $sql);
}
所以在第一次迭代所有1
被1
代替,那麼所有2
被3
置換後,所有3
被4
取代:
SELECT * FROM %s WHERE no_1 IN (%s) AND no_2 IN (%s) AND no_3 IN (%s)
SELECT * FROM %s WHERE no_1 IN (%s) AND no_3 IN (%s) AND no_3 IN (%s)
SELECT * FROM %s WHERE no_1 IN (%s) AND no_4 IN (%s) AND no_4 IN (%s)
要做到同時更換,你可以使用preg_replace_callback
並調用映射函數對每個匹配的模式:
function str_replacep(array $search, array $replace, $subject, &$count=0) {
$combinedPattern = '/(?:'.implode('|', array_map(function($str) { return preg_quote($str, '/'); }, $search)).')/';
$map = array_combine($search, $replace);
$mapping = function($match) use ($map, $count) {
$count++;
return $map[$match[0]];
};
return preg_replace_callback($combinedPattern, $mapping, $subject);
}
我在這個例子中使用anonymous function,但它也將與create_function
工作。
有了這個替換的順序並不重要。你甚至可以交換兩個值:
var_dump(str_replacep(array(1,2), array(2,1), "12")); // string(2) "21"
好的。那麼這種情況的解決方案是什麼? – elfuego1 2011-03-13 10:43:06
@elfuego我已經編輯了我的答案,並提供了一個可能的解決方案 – 2011-03-13 10:43:48
這個完美正是我所需要的。非常感謝Martin! – elfuego1 2011-03-13 12:39:44