Разбор многоуровневого массива для просмотра-файл

#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. Как можно было бы создать способ включения шаблонов в другие шаблоны?