2015-06-14 3 views
2

Я пытаюсь создать многоуровневое выпадающее меню с mysql в качестве данных хранилища, и я использую ветку в качестве движка темы, я знаю, что есть тонна кода снаружи, но все они HTML в качестве вывода , так как я использую ветку, поэтому мне нужен массив в качестве выходного файла, и пусть twig отображает его (или, может быть, есть другой вариант, дайте мне знать, если это так).
этот код работа если я использую html как мощность. но если я перехожу к массиву в качестве вывода, проблема в 2-м уровне меню показывает только 1 массив или первый массив, это не цикл.
это мой выходной массив из запросов MySQL,значение цикла цикла с функцией php

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [title] => Dashboard 
      [link] => 1.html 
      [parent_id] => 0 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [title] => Master Data 
      [link] => 2.html 
      [parent_id] => 0 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [title] => submaster 
      [link] => 11.html 
      [parent_id] => 2 
     ) 
    [3] => Array 
     (
      [id] => 4 
      [title] => submaster 
      [link] => 12.html 
      [parent_id] => 2 
     ) 

и вот код я пытаюсь преобразовать, я имею в виду, прежде чем ему код HTML, как выход (UL> LI> уль> li>/li>/уль >/li>/лу)

$id = ''; 
function sub($items, $id){ 
    foreach($items as $item){ 
     if($item['parent_id'] == $id){ 
      return array("link" =>$item['link'],"title"=>$item['title']); 
      sub($items, $item['id']); 
     } 
    } 
} 
foreach($allmenu as $data){ 
    if($data['parent_id'] == 0){ 
     $id = $data['id']; 
     $utama[]= array("link"=>$data['link'],"title"=>$data['title'],"sub"=>sub($allmenu, $id)); 
    } 
} 

и это выход из выше кода

Array 
(
    [links] => Array 
     (
      [0] => Array 
       (
        [link] => 1.html 
        [title] => Dashboard 
        [sub] => 
       ) 

      [1] => Array 
       (
        [link] => 2.html 
        [title] => Master Data 
        [sub] => Array 
         (
          [link] => 11.html 
          [title] => Kampus 
         ) 

       ) 

     ) 

) 

см .. во 2-ом массиве (основные данные), следует два массива правильно? со ссылкой 11.html и 12.html.
если есть ошибка из моего кода, дайте мне знать, если есть ссылка, чтобы сделать эту работу, дайте мне знать. спасибо

ответ

0

Надежда эта работа

function sub($items, $id){ 
     foreach($items as $item){ 
      if($item['parent_id'] == $id){ 
       $sub = sub($items, $item['id']); 
       if(!empty($sub)) 
        return array("link" =>$item['link'],"title"=>$item['title'],"sub"=>$sub); 
       return array("link" =>$item['link'],"title"=>$item['title']); 
      } 
     } 
    } 

    foreach($allmenu as $data){ 
     if($data['parent_id'] == 0){ 
      $id = $data['id']; 
      $utama[]= array("link"=>$data['link'],"title"=>$data['title'],"sub"=>sub($allmenu, $id)); 
     } 
    } 
+0

Функция OP 'sub()' прерывает итерацию после обнаружения первого дочернего элемента из-за возврата. Вот та же проблема. – Henrik

1

Функция OP sub() прерывает итерацию после обнаружения первого дочернего элемента из-за возврата. Лучше создать массив всех дочерних элементами данного родителя $id и вернуть этот массив в конце функции:

function sub($items, $id){ 
    $subarray = array(); 
    foreach($items as $item){ 
     if($item['parent_id'] == $id){ 
      $subarray[] = array(
       "link" => $item['link'], 
       "title" => $item['title'], 
       "sub" => sub($items, $item['id']), 
      ); 
     } 
    } 
    return $subarray; 
} 

Я также интегрировал вызов sub() внутри наращивания вспомогательного массива. Недостатком является то, что для каждого вызова функции sub() массив меню отверстий повторяется. Это можно было бы улучшить в следующей версии.

Вот результат:

Array 
(
    [0] => Array 
     (
      [link] => 1.html 
      [title] => Dashboard 
      [sub] => Array 
       (
       ) 
     ) 

    [1] => Array 
     (
      [link] => 2.html 
      [title] => Master Data 
      [sub] => Array 
       (
        [0] => Array 
         (
          [link] => 11.html 
          [title] => submaster 
          [sub] => Array 
           (
           ) 
         ) 

        [1] => Array 
         (
          [link] => 12.html 
          [title] => submaster 
          [sub] => Array 
           (
           ) 
         ) 
       ) 
     ) 
) 

Кроме того, некоторые дополнительные улучшения: Для того, чтобы удалить пустые массивы подменю I включают тест. Значение по умолчанию для параметра установлено на $id = 0. При этом нет необходимости передавать родительский идентификатор для начального вызова. Теперь больше нет необходимости в цикле foreach в основной программе. Вы можете позвонить по телефону sub(). Используя те же имена переменных, как OP программы выглядит следующим образом:

function sub($items, $id = 0){ 
    $subarray = array(); 
    foreach($items as $item){ 
     if($item['parent_id'] == $id) { 
      $submenu = array(
       "link" => $item['link'], 
       "title" => $item['title'], 
      ); 
      $subsubmenu = sub($items, $item['id']); 
      if (!empty($subsubmenu)) { 
       $submenu['sub'] = $subsubmenu; 
      } 
      $subarray[] = $submenu; 
     } 
    } 
    return $subarray; 
} 

$utama = sub($allmenu); 

Другой пример того, как можно передать массив 2-уровня глубины в массив многоплатформенного уровня глубины можно найти в this answer.

0

ОК, я немного поменяю ваш код.

function sub($items, $id){ 
    $subarray = array(); 
    foreach($items as $item){ 
     if($item['parent_id'] == $id){ 
      $submenu = sub($items, $item['id']); 
      if (empty($submenu)) { 
      $subarray[] = array("link" => $item['link'], "title" => $item['title']); 
     } else { 
      $subarray[]= array("link" => $item['link'], "title" => $item['title'], "sub" => $submenu); 
     } 

     } 
    } 
    return $subarray; 
} 

так же, как массив в $ Утама, если имеется подзаголовок писать, и есть опечатка из кода "sub" => sub($allmenu, $id), он должен быть "sub" => sub($items, $item['id'), кстати спасибо большое, вы сохраните свою жизнь, с этим я могу создать ALOT вложенное меню.

+0

Да, вы правы. Я наблюдал за неправильным использованием '$ allmenu' в' sub() '. Я отредактировал это в своем ответе. Постановка теста на пустое подменю в 'sub()' также является хорошей идеей. – Henrik

Смежные вопросы