我注意到str_replace函数的一种奇怪行为。你能告诉我为什么在no_2中不是3号,而是no_4吗?
情况如下:
$pattern = array(1,2,3);
$change = array(1,3,4);
$sql = "SELECT * FROM %s WHERE no_1 IN (%s) AND no_2 IN (%s) AND no_3 IN (%s)";
$test_multiply[] = str_replace($pattern, $change, $sql);这意味着:
Array ( [0] => SELECT * FROM %s WHERE no_1 IN (%s) AND no_4 IN (%s) AND no_4 IN (%s) ) 你能告诉我怎样才能收到no_3而不是no_2吗?
发布于 2011-03-13 10:39:33
str_replace()的文档显示(引用):
因为str_replace()可以从左到右替换,所以在执行多个替换时可能会替换以前插入的值。
我相信你正处于这样的情况:
no_2被替换为no_3 --因为在$pattern和$change数组中有第二个项。no_3被替换为no_4 --因为在$pattern和$change数组中有thid项。为了避免这种特殊情况,您可以尝试颠倒这两个数组中项的顺序:
$pattern = array(3, 2, 1);
$change = array(4, 3, 1); 你会得到以下结果:
SELECT * FROM %s WHERE no_1 IN (%s) AND no_3 IN (%s) AND no_4 IN (%s)发布于 2011-03-13 10:45:13
如果将str_replace与一系列针头一起使用,则每个针都会在单独的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);
}在本例中,我使用了匿名函数,但它也适用于create_function。
有了这个,替换的顺序就无关紧要了。您甚至可以交换两个值:
var_dump(str_replacep(array(1,2), array(2,1), "12")); // string(2) "21"发布于 2011-03-13 10:40:26
首先,你用1代替1,所以没问题
SELECT * FROM %s WHERE no_1 IN (%s) AND no_2 IN (%s) AND no_3 IN (%s)
然后,用3代替2,得到
SELECT * FROM %s WHERE no_1 IN (%s) AND no_3 IN (%s) AND no_3 IN (%s)
然后将3替换为4,从而产生SELECT * FROM %s WHERE no_1 IN (%s) AND no_4 IN (%s) AND no_4 IN (%s)
也许您应该用另一个值(而不是3)替换2,以后您可以再次替换它。
https://stackoverflow.com/questions/5288829
复制相似问题