Класс шаблона, не связанный с str_replace

Ну, у меня есть этот набор кодов

<?php include "includes/config.php"; class template{ var $page; var $built; public $block = array(); function _start($tpl){ $this->page = $tpl; } function set_array($data){ $this->block[] = $data; } function _show(){ foreach($this->block as $k => $v){ foreach($v as $k1 => $v1){ //echo $k1."<br />"; //echo $v1."<br />"; $this->page = str_replace("{".$k1."}", $v1, $this->page); } } echo $this->page; } } $template = new template(); $file = "<html> <body> <p>{CAT}</p> <p>{SUBCAT}</p> </body> </html>"; $template->_start($file); // Category Query while($row1 = mysql_fetch_assoc($cat)){ $template->set_array(array("CAT" => $row1['title'])); // Sub Category Query while($row2 = mysql_fetch_assoc($subcat)){ $template->set_array(array("SUBCAT" => $row2['title'])); } } $template->_show(); ?> 

Теперь, когда i echo $ k1 или $ v1, они отображают ключи и значения в правильном порядке, например

CAT1 SUBCAT1.1 SUBCAT1.2 CAT2 SUBCAT2.1 SUBCAT2.2

но когда он проходит через str_replace, он отображает только CAT1 и SUBCAT1.2, что происходит не так?

Вы переписываете переменную $ page внутри цикла foreach (); либо вы делаете его массивом, либо добавляете к переменной. Может быть:

 function _show(){ $this->page = ''; foreach($this->block as $k => $v){ foreach($v as $k1 => $v1){ $this->page .= str_replace("{".$k1."}", $v1, $this->page); //appending every time onto the previous. As you were doing: // $this->page =str_replace("{".$k1."}", $v1, $this->page); // here you were overwriting $this->page at every passage of the loop } } echo $this->page; }