|
|
|
| Здравствуйте! Решил шаблонайзер свой написать... Почти написал, но возникла трабла с выводом многомерных массивов.
Вот есть массив (как в предыдущем моем сабже)
<?
$array = array(
array("id"=>"id-1", "info"=>"test-1"),
array("id"=>"id-2", "info"=>"test-2"),
array("id"=>"id-3", "info"=>"test-3")
);
?>
|
Вот шаблон, который должен по идее представлять этот массив
<multy_array name="zxc">
<value name="id" /> || <value name="info" /><br />
</multy_array name="zxc">
|
Вот собственно класс
<?
class Template
{
private $template = "";
private $multyArray = array();
public function __construct($template)
{
$this->template = (is_file($template) && is_readable($template))?file_get_contents($template):"";
}
public function LoadMultyArray($multyArray, $name)
{
$this->multyArray[$name] = $multyArray;
}
public function OutPut()
{
$this->parseMultyArray();
return $this->template;
}
private function parseMultyArray()
{
foreach($this->multyArray as $key=>$val)
{
$startTag = "<multy_array name=\"$key\">";
$endTag = "</multy_array name=\"$key\">";
$pattern = "|".$startTag."(.*?)".$endTag."|is";
preg_match($pattern, $this->template, $out);
$i = 0;
foreach($val as $array)
{
foreach($array as $k=>$v)
{
$i++;
$bodyTag[] = array("name"=>"<value name=\"$k\" />", "value"=>$v);
}
$whileText.=str_replace($bodyTag[$i]['name'],$bodyTag[$i]['value'],$out[1]);
}
$this->template = str_replace($out[0], $whileText, $this->template);
}
}
}
?>
|
Тело метода parseMultyArray() неправильно все обрабатывает. Помогите исправить этот метод, чтобы он корректно обрабатывал шаблон. | |
|
|
|
|
|
|
|
для: t4f
(15.02.2007 в 15:07)
| | Не правильно это как? Сопровождается ли это какими-нибудь эффектами? | |
|
|
|
|
|
|
|
для: cheops
(15.02.2007 в 16:23)
| | Т.е. заменяет, но...
Вот еще одна переработка этого метода
private function parseMultyArray()
{
foreach($this->multyArray as $key=>$val)
{
$startTag = "<multy_array name=\"$key\">";
$endTag = "</multy_array name=\"$key\">";
$pattern = "|".$startTag."(.*?)".$endTag."|is";
preg_match($pattern, $this->template, $out);
foreach($val as $array)
{
foreach($array as $k=>$v)
{
$bt[] = array("<value name=\"$k\" />", $v);
}
}
}
foreach($bt as $tb)
{
$whileText.=str_replace($tb[0],$tb[1],$out[1]);
}
$this->template = str_replace($out[0], $whileText, $this->template);
}
|
вот его вывод. У меня все попытки сводятся к такому выводу.
id-1 || <value name="info" /><br />
<value name="id" /> || test-1<br />
id-2 || <value name="info" /><br />
<value name="id" /> || test-2<br />
id-3 || <value name="info" /><br />
<value name="id" /> || test-3<br />
|
А нужен такой:
id-1 || test-1<br />
id-2 || test-2<br />
id-3 || test-3<br />
|
| |
|
|
|
|
|
|
|
для: t4f
(15.02.2007 в 16:27)
| | Тему можно закрывать. Я нашел правильное решение.
private function parseMultyArray()
{
foreach($this->multyArray as $key=>$val)
{
$startTag = "<multy_array name=\"$key\">";
$endTag = "</multy_array name=\"$key\">";
$pattern = "|".$startTag."(.*?)".$endTag."|is";
preg_match($pattern, $this->template, $out);
$keys = array_keys($val);
$сnt = count($keys);
for($i=0; $i<$сnt; $i++)
{
$tempText = $out[1];
foreach($val[$keys[$i]] as $k=>$v)
{
$tempText = str_replace("<var name=\"$k\" />", $v, $tempText);
}
$newText .= $tempText;
}
$this->template = str_replace($out[0], $newText, $this->template);
}
}
|
| |
|
|
|