Я работаю над созданием модульной системы CMS в codeigniter, и у меня возникают проблемы с выяснением того, как и могу ли я динамически добавлять ключи массива в функцию, основываясь на текущей глубине массива.Например, у меня есть данные, которые выглядят следующим образом -
[header] => Array (
[blocks] => Array (
[utilitynav] => Array (
[name] => utilitynav [module] => admin [helper] => [model] => [data] =>
)
[topnav] => Array (
[name] => topnav [module] => admin [helper] => topnav [model] => Db_Sitepages [data] =>
)
[subhead] => Array (
[name] => subhead [module] => admin [helper] => [model] => [data] => [hasChildren] => 1
[blocks] => Array (
[testchild] => Array ( [name] => testchild [module] => admin [helper] => [model] => [data] => [parent] => subhead
)
)
)
)
)
- В основном, у блоков есть дочерние элементы, которые заключены в родительский блок.Я пытаюсь найти эффективный способ управления уровнями, так как сейчас я использую отдельную функцию для вывода дочерних блоков, и если бы я хотел иметь возможность пройти 3 уровня глубиной, мне пришлось бы создать еще одну функцию.Поэтому я пытаюсь сделать это рекурсивно, динамически добавляя ключ массива в my для каждого оператора каждый раз, когда функция повторяется.
Например, эту функцию я использую для вывода блоков -
function outputChildBlocks($view_name)
{
if(isset($this->view_data[$view_name]['blocks']))
{
$html='<div class="blockWrapper">';
foreach($this->view_data[$view_name]['blocks'] as $block)
{
$html.= '<div class="block '.$block['name'].'">';
$module = $block['module'];
$name = $block['name'];
$data['block'] = $block;
if($block['helper'] != null)
{
$this->load->helper($module.'/'.$block['helper']);
}
if($block['model'] != null)
{
$data['model'] = new $block['model']();
}
$html .= $this->load->view($module.'/blocks/'.$name, $data, true);
if(isset($block['hasChildren']))
{
$html .= $this->outputChildChildBlocks($view_name, $name);
}
$html.= '</div>';
}
$html .= '</div>';
return $html;
}
}
Как видите, в нижней части я проверяю, есть ли у родителя дочерние элементы, и если это так, я вызываю совершенно отдельную функцию для вывода дочерних блоков (outputChildChildBlocks) - поэтому вместо этого я быхотелось бы, чтобы функция распознала глубину текущего местоположения, и когда она попадает в оператор if внизу, если у нее есть дочерние элементы, запускается сама, добавляя счетчик для каждого уровня, а затем вместо
foreach ($ this-> view_data [$ view_name] ['blocks'] как $ block)
пусть идет
foreach ($ this-> view_data [$ view_name] ['blocks'] [$ name] [' blocks '] как $ block)
для 2-го уровня, затем перейти на
foreach ($ this-> view_data [$ view_name] [' blocks '][$ name] ['blocks'] [$ name] ['blocks'] как $ block)
для 3-го уровня, сo и т. д.
В любом случае, я не уверен, как динамически добавлять ключ ['blocks'] в массив для каждой итерации функции, которая была запущена для этого основного блока ...(очевидно, у меня есть блок [нижний колонтитул] и [контент] и что не так хорошо с их собственными наборами блоков)
В любом случае, извините, если я перебил или усложнил вопрос, у меня есть тенденция делать это, ноЯ стараюсь быть максимально ясным, и я буду вам признателен, если вы сможете показать мне лучший способ сделать эту функцию рекурсивной!