2013-12-20 2 views
0

Хорошо, полностью застрял на этом, это должно быть довольно просто.Сложная строка заменить

У меня есть два массива:

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> 
" 
    } 
} 

В основном я хочу, чтобы заменить мест где [ххх] в первом массиве [контента] со вторым массивом [элемент] который соответствует массиву [name]. (?!) Надеюсь, что имеет смысл

До сих пор я попытался это:

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

Однако это только кажется, заменить содержание согласованного в первом элементе array2 и не все из них.

Любая идея в том, что случилось?

В качестве примечания, я сделал некоторое чтение и подумал, что проще было бы с помощью strtr(), но я не уверен, возможно ли это с моими данными. любой совет по этому было бы здорово!

+0

При запросе вопроса user 'print_r' вместо' var_dump' для отображения информации. 'var_dump' добавляет ненужную информацию на вопрос, из-за которой сложнее читать – chanchal118

+1

@ chanchal118 Нет,' var_dump' лучше. 'print_r' не отображает границы строк - вы не знаете, что в' $ array2 [1] ['content'] есть новая строка. ' – Barmar

+0

@enigma Зачем ему это нужно? Он не использует 'preg_replace()'. – Barmar

ответ

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']); 
} 
+0

ahhh да, конечно, это имеет смысл! хорошее место, спасибо! –

Смежные вопросы