Pętla foreach w szablonie
Próbuje stworzyć własny, bardzo prosty system szablonów w PHP (głównie żeby czegoś się nauczyć). Zamiana prostych zmiennych działa, ale mam problem ze stworzeniem pętli foreach. Szablon miałby wyglądać tak:
{FOREACH users as user}
{user.name} <br />
{user.surname} <br />
{/FOREACH users}
Teraz mam w mojej klasie funkcję do zamiany tego na coś bardziej czytelnego:
public function replace_loop()
{
// Szukanie pętli
preg_match(
'#\{FOREACH\s+(\w+)\s+as\s+(\w+)\}(.*)\{\/FOREACH\s+\1}#ms',
$this->template, $loop);
/*
$loop[0] // cały blok do nadpisania
$loop[1] // nazwa pętli
$loop[2] // alias zmiennych pętli
$loop[3] // część środkowa do zamiany
*/
if ($loop === null)
return false;
$result = '';
foreach($this->variables[$loop[1]] as $$loop[2])
{
if(is_object($$loop[2]))
$replacement = preg_replace('#\{(\w+)(.)(\w+)\}#', '$\1->\3', $loop[3]);
elseif(is_array($$loop[2]))
$replacement = preg_replace('#\{(\w+)(.)(\w+)\}#', '$\1[\'\3\']', $loop[3]);
$result .= "$replacement";
}
return $result;
//Zamiana dalsza
}
W pętli foreach następuje zamiana zmiennych szablonowych na phpowe. String $replacement wygląda tak:
$user->name <br />
$user->surname <br />
Teraz chciałbym, aby w tym stringu nastąpiło przypisanie wartości obiektu $$loop[2] i dodanie go do wyniku końcowego $result. Ma to robić linijka
$result .= "$replacement";
czego jednak nie czyni, bo zwracany wynik to:
$user->name <br />
$user->surname <br />
$user->name <br />
$user->surname <br />
Czy da się to jakoś zrobić, żeby działało tak jakbym chciał, czy raczej należało by to napisać od nowa, bo z tym kodem nie ma szans?