Замените "блоки" в PHP из многоступенчатого массива - PullRequest
0 голосов
/ 14 апреля 2020

Я заменяю «блок» в PHP из массива:

function replaceBlock($name, $toRep) {
    preg_match('/\<\?block_s= '.$name.' \?\>([\s\S]*?)\<\?block_e= '.$name.' \?\>/', $this->tpl, $blockContent);
    $arr = [];
    foreach ($toRep as $key => $value) {
        $arr[] = $this->replaceVar($value['vars'], 'block_v', $blockContent[1]);
    }

    $this->tpl = preg_replace('/\<\?block_start= '.$name.' \?\>([\s\S]*?)\<\?block_end= '.$name.' \?\>/', implode($arr), $this->tpl);
}

My $name - это что-то вроде массива 'blockname' et c.
My $toRep выглядит так:

Array
    (
        [0] => Array
            (
                [var] => value1

            )
        [1] => Array
            (
                [var] => value2
            )

    )

Это мой HTML код:

{block_start testblock}
    <div>
        <p>{var}</p>
    </div>
{block_end testblock}

Когда я сейчас вызываю функцию replaceBlock() с именем блока testblock и моим $toRep массив, я получу это:

<div>
    <p>value1</p>
    <p>value2</p>
</div>

Это именно то, что я хочу.

Но теперь мой вопрос:
Как я могу заставить эту функцию работать с блоком внутри блока?
Например, у меня теперь есть этот блок:

{block_start testblock}
    <div>
        <p>{var}</p>
        {block_start subblock}
            <span>{subvar}</span>
        {block_end subblock}
    </div>
{block_end testblock}

Но я не знаю, как структурировать мой массив или как заставить мою функцию работать с многоступенчатым массивом, чтобы он заменял блок в блоке.

...