str_replace正在替换一行,而不是另一行

时间:2013-09-17 07:59:38

标签: php

我遇到了一个奇怪的问题。我有以下代码:

$foo = array(
        "some" => array(
            "foo" => "boohoo",
            "bar" => "foobar"
        ),
        "really" => array(
            "foo" => "boohoo",
            "bar" => "barfoo"
        ),
        "strange" => array(
            "foo" => "boohoo",
            "bar" => "foobarfoo"
        ),
        "occurences" => array(
            "foo" => "boohoo",
            "bar" => "barbaz"
        )
    );

$page = "";

foreach($foo as $bar)
{
    $subj = $template->loadTemplate('foobar', true);

    $str = "";

    $str = str_replace("{foo}", $bar['foo'], $subj);
    $str = str_replace("{bar}", $bar['bar'], $subj);

    $page .= $str;
}

这里的问题是,当运行PHP代码时,{bar}将替换在我的模板中,而不是{foo}。我切换了两条str_replace行,得到了不同的结果 - {foo}被替换了,但{bar}不是!我也尝试将其换成preg_replace而没有任何改变。对于记录,$template->loadTemplate()函数不对加载的字符串执行任何操作,它只是从文件中获取模板。

我的问题是:为什么PHP会以这种方式运行,其次,我如何克服这个限制/错误?

2 个答案:

答案 0 :(得分:7)

您只更改一个,因为两个替换使用相同的输入字符串:

$str = str_replace("{foo}", $bar['foo'], $subj);
$str = str_replace("{bar}", $bar['bar'], $subj);

试试这个:

$str = str_replace("{foo}", $bar['foo'], $subj);
$str = str_replace("{bar}", $bar['bar'], $str);

答案 1 :(得分:3)

正如所说的CORRUPT,你正在替换排除上一个命令的字符串 我添加了str_replace支持Array()作为参数。

$str = str_replace(Array("{foo}","{bar}"), Array($bar['foo'], $bar['bar']) , $subj);