#php #model-view-controller #multidimensional-array #html-parsing
#php #модель-представление-контроллер #многомерный массив #html-синтаксический анализ
Вопрос:
Мне нужно разобрать многоуровневый массив для моего файла просмотра.
Мой массив может быть таким:
$test = array(
1 => array(
10 => array('text' => 'test'),
15 => array(
12 => array('text' => 'Test')
),
'text' => 'Nr. 1'
),
4 => array(
14 => array('text' => 'Hello'),
'text' => 'Nr. 4'
)
)
Это будет передано в файл просмотра, который может выглядеть следующим образом:
{test}
{text}
{/test}
Моя проблема в том, что это покажет только первый уровень — я хочу иметь неограниченное количество уровней.. Возможно ли это без обходного пути, когда я создаю HTML в PHP-файле, а затем передаю HTML в файл просмотра?
Ответ №1:
Похоже, вам нужно немного рекурсии.
function recurse_output($input, $level = 0) {
foreach($input as $key => $value) {
echo "n", str_repeat(" ", $level);
echo "<div>{$key} is: ";
if(is_array($value))
recurse_output($value, $level 1);
else
echo $value;
echo str_repeat(" ", $level);
echo "</div>n";
}
}
При запуске с вашими входными данными результатом является:
<div>1 is:
<div>10 is:
<div>text is: test </div>
</div>
<div>15 is:
<div>12 is:
<div>text is: Test </div>
</div>
</div>
<div>text is: Nr. 1 </div>
</div>
<div>4 is:
<div>14 is:
<div>text is: Hello </div>
</div>
<div>text is: Nr. 4 </div>
</div>
Должно быть довольно просто изменить код, чтобы он не выдавал ничего, кроме $key
is 'text'
. Я не знаю, какую систему шаблонов вы выбрали для своего механизма просмотра, но большинство из них допускают аналогичный рекурсивный вызов.
Комментарии:
1. Ну, я использую что-то похожее на CodeIgniter… Куда бы вы поместили recurse-функцию?
2. На самом деле функция может быть просто (частичным) файлом шаблона, на самом деле. Я мало что знаю о CI, но если вы можете устанавливать переменные только в контексте шаблона и это позволяет шаблонам включать другие шаблоны, тогда вы должны быть полностью в состоянии сделать это рекурсивным.
3. Возможно, это означает, что я должен доработать свой фреймворк. Это не CI, но я создал свой собственный, вдохновившись анализатором шаблонов CodeIgniter. Как можно было бы создать способ включения шаблонов в другие шаблоны?