复杂字符串替换

时间:2013-12-20 10:59:27

标签: php arrays string

好吧我完全坚持这个,它应该很简单。

我有两个数组:

array(2) {
[0]=>
  array(7) {
    ["id"]=>
    string(1) "4"
    ["name"]=>
    string(9) "Page name"
    ["content"]=>
    string(133) "<div class="content col-lg-12">[Jumbo]</div><div class="content col-lg-12">[Jumbo]</div><div class="content col-lg-12">[Footer]</div>"
    ["container"]=>
    string(1) "0"
    ["background"]=>
    string(7) "#ff7676"
    ["homepage"]=>
    string(1) "1"
    ["active"]=>
    string(1) "1"
  }
  [1]=>
  array(7) {
    ["id"]=>
    string(1) "7"
    ["name"]=>
    string(8) "Layout 1"
    ["content"]=>
    string(119) "<div class="content col-lg-12">[Header]</div><div class="content col-lg-12"></div><div class="content col-lg-12"></div>"
    ["container"]=>
    string(1) "1"
    ["background"]=>
    string(7) "#ff7676"
    ["homepage"]=>
    string(1) "1"
    ["active"]=>
    string(1) "1"
  }
}

array(2) {
  [0]=>
  array(9) {
    ["id"]=>
    string(1) "8"
    ["name"]=>
    string(5) "Jumbo"
    ["headCSS"]=>
    string(0) ""
    ["classes"]=>
    string(39) "jumbotron module col-lg-6 round-corners"
    ["inlineCSS"]=>
    string(144) "background: none repeat scroll 0% 0% rgb(229, 255, 135); border-width: 3px; border-style: solid; border-color: rgb(45, 152, 255); padding: 10px;"
    ["element"]=>
    string(247) "                <div style="background: none repeat scroll 0% 0% rgb(229, 255, 135); border-width: 3px; border-style: solid; border-color: rgb(45, 152, 255); padding: 10px;" class="jumbotron module col-lg-6 round-corners">Example</div>            "
    ["type"]=>
    string(6) "header"
    ["size"]=>
    string(1) "6"
    ["content"]=>
    string(7) "Example"
  }
  [1]=>
  array(9) {
    ["id"]=>
    string(2) "12"
    ["name"]=>
    string(6) "Footer"
    ["headCSS"]=>
    string(0) ""
    ["classes"]=>
    string(30) "module round-corners col-lg-10"
    ["inlineCSS"]=>
    string(64) "background: none repeat scroll 0% 0% transparent; padding: 10px;"
    ["element"]=>
    string(143) "<footer style="background: none repeat scroll 0% 0% transparent; padding: 10px;" class="module round-corners col-lg-10"><p>Raaaa!</p>
</footer>"
    ["type"]=>
    string(6) "footer"
    ["size"]=>
    string(2) "10"
    ["content"]=>
    string(14) "<p>Raaaa!</p>
"
  }
}

基本上我想将第一个数组[content]中的[xxx]的出现替换为与数组[name]匹配的第二个数组[element]。希望有意义(?!)

到目前为止,我已经尝试过这个:

foreach($array1 as $layout) {
    foreach($array2 as $module) {
        $needle = "[" . trim($module['name']) . "]";
        $pages[$layout['name']] = str_replace($needle, $module['element'], $layout['content']);
    };
};

然而,这似乎只是替换了第一个array2元素中匹配的内容而不是所有内容。

任何想法都错了吗?

作为旁注,iv做了一些阅读,并认为使用strtr()可能会更容易,但我不确定这是否可能与我的数据。对此的任何建议都会很棒!

1 个答案:

答案 0 :(得分:2)

问题是,您始终使用$layout['content']作为str_replace中的主题,而不是更新的$pages[$layout['name']]。所以你没有合并所有的替代品,你用新的替代品覆盖旧的替代品。

您可以通过将搜索和替换字符串数组提供给str_replace()来一次执行所有替换来解决此问题。

$searches = array();
$replacements = array();
foreach ($array2 as $module) {
    $searches[] = "[" . trim($module['name']) . "]";
    $replacements[] = $module['element'];
}
foreach ($array1 as $layout) {
   $pages[$layout['name']] = str_replace($searches, $replacements, $layout['content']);
}