El asunto es que no se puede mezclar la lógica dentro de una cadena de texto, la idea es ir concatenando o imprimir en putos separados.
Si tu objetivo es almacenar toda la lógica en una cadena lo correcto es concatenar, o si te sientes cómodo imprimiendo es mejor utilizar buffers:
Código PHP:
Ver original// concatenación
$str = '';
$str .= '<tag>';
while (/* ... */) {
$str .= '<subtag>';
$str .= $value;
$str .= '</subtag>';
}
$str .= '</tag>';
// buffers
echo '<tag>';
while (/* ... */) {
echo '<subtag>';
echo $value;
echo '</subtag>';
}
echo '</tag>';
Si observas bien, tu código no se parece nada a esto.
Tienes que separar la lógica pero también debes reanudar la impresión después de interrumpirla, etc.