Динамически дублировать ключ массива в php для рекурсии функции? - PullRequest
1 голос
/ 07 января 2011

Я работаю над созданием модульной системы 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'] в массив для каждой итерации функции, которая была запущена для этого основного блока ...(очевидно, у меня есть блок [нижний колонтитул] и [контент] и что не так хорошо с их собственными наборами блоков)

В любом случае, извините, если я перебил или усложнил вопрос, у меня есть тенденция делать это, ноЯ стараюсь быть максимально ясным, и я буду вам признателен, если вы сможете показать мне лучший способ сделать эту функцию рекурсивной!

1 Ответ

2 голосов
/ 07 января 2011

Я думаю, что вы задаете не тот вопрос.Вы не должны дублировать ключи массива.Вы должны использовать уже существующую рекурсивную архитектуру вашего массива и сопоставить свой php-код с этим:)

Я думаю, что обращение к $ this-> view_data внутри вашей функции все испортило.если вы позволите функции outputChildBlocks взять часть массива, содержащую блоки, которые «наверху» на этот раз , вы сможете снова вызывать ту же функцию изнутри себя, но в это время вы просто передаетеправильный дочерний элемент массива, который вы получили в функции.имеет смысл?

Теперь единственная проблема - вызвать эту функцию для начала.вызов этой функции извне функции требует, чтобы вы точно знали, что передать ей.не должно быть проблемой, хотявызывающая сторона, вероятно, будет другой функцией в том же классе, и тогда она должна иметь возможность выбрать правильный элемент из $ this-> view_data для передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...