首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP: str_replace的问题

PHP: str_replace的问题
EN

Stack Overflow用户
提问于 2011-03-13 10:35:30
回答 4查看 901关注 0票数 1

我注意到str_replace函数的一种奇怪行为。你能告诉我为什么在no_2中不是3号,而是no_4吗?

情况如下:

代码语言:javascript
运行
复制
$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);

这意味着:

代码语言:javascript
运行
复制
Array ( [0] => SELECT * FROM %s WHERE no_1 IN (%s) AND no_4 IN (%s) AND no_4 IN (%s) ) 

你能告诉我怎样才能收到no_3而不是no_2吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-13 10:39:33

str_replace()的文档显示(引用):

因为str_replace()可以从左到右替换,所以在执行多个替换时可能会替换以前插入的值。

我相信你正处于这样的情况:

  • 您的no_2被替换为no_3 --因为$pattern$change数组中有第二个项。
  • 但是,该no_3被替换为no_4 --因为在$pattern$change数组中有thid项。

为了避免这种特殊情况,您可以尝试颠倒这两个数组中项的顺序:

代码语言:javascript
运行
复制
$pattern = array(3, 2, 1);
$change = array(4, 3, 1); 

你会得到以下结果:

代码语言:javascript
运行
复制
SELECT * FROM %s WHERE no_1 IN (%s) AND no_3 IN (%s) AND no_4 IN (%s)
票数 7
EN

Stack Overflow用户

发布于 2011-03-13 10:45:13

如果将str_replace与一系列针头一起使用,则每个针都会在单独的str_replace调用中替换。您可以想象这样的事情发生在内部:

代码语言:javascript
运行
复制
for ($i=0, $n=min(count($pattern),count($change)); $i<$n; $i++) {
    $sql = str_replace($pattern[$i], $change[$i], $sql);
}

因此,在第一次迭代中,所有11替换,然后所有23替换,然后所有34替换。

  1. SELECT * FROM %s WHERE no_1 IN (%s) AND no_2 IN (%s) AND no_3 IN (%s)
  2. SELECT * FROM %s WHERE no_1 IN (%s) AND no_3 IN (%s) AND no_3 IN (%s)
  3. SELECT * FROM %s WHERE no_1 IN (%s) AND no_4 IN (%s) AND no_4 IN (%s)

要同时进行替换,可以使用preg_replace_callback并为每个匹配的模式调用映射函数:

代码语言:javascript
运行
复制
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

有了这个,替换的顺序就无关紧要了。您甚至可以交换两个值:

代码语言:javascript
运行
复制
var_dump(str_replacep(array(1,2), array(2,1), "12"));  // string(2) "21"
票数 3
EN

Stack Overflow用户

发布于 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,以后您可以再次替换它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5288829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档