2013-12-19 2 views
0

Итак, я пытаюсь создать динамическую панель навигации, которая создается через элементы меню, хранящиеся в базе данных.Подсчет размера массива, внутри элемента массива - PHP

Каждому элементу меню присваивается parent_id, если этот идентификатор равен 0, этот элемент является родительским; если этот id является значением выше 0, то этот пункт меню является дочерним элементом другого элемента меню. (Представьте, что вы нависаете над пунктом меню навигации и получаете раскрывающийся список дочерних элементов)

Следующая функция - это то, что создает многомерный массив из записей в базе данных.

function build_menu($menu_id){ 
    $mysqli = new mysqli("localhost", "user", "password", "db"); 
    if($mysqli->connect_errno){ 
     echo "Failed to connect to MySQL: " . $mysqli->connect_errno; 
    } 

    $stmt = $mysqli->prepare("SELECT `id`, `name`, `order`, `parent_id`, `path` FROM menu_items WHERE `group_id` = ? ORDER BY `order` ASC"); 
    $menu_id = intval($mysqli->real_escape_string($menu_id)); 
    $stmt->bind_param('i', $menu_id); 
    if($stmt->execute()){ 
     $results = resultToArray($stmt->get_result()); 
     $parents = array(); 
     $children = array(); 
     $menu = array(); 
     for($i=0; $i<count($results); $i++){ 
      if($results[$i]['parent_id'] === 0){ 
       $parents[] = $results[$i]; 
      } else { 
       $children[] = $results[$i]; 
      } 
     } 

     for($i=0; $i<count($parents); $i++){ 
      $menu[$i] = $parents[$i]; 
      for($j=0; $j<count($children); $j++){ 
       if($children[$j]['parent_id'] === $parents[$i]['id']){ 
        $menu[$i][$j] = $children[$j]; 
       } 
      } 
     } 
     return($menu); 
    } else { 
     echo "Failed to execute statement: " . $stmt->errno . ": " . $stmt->error; 
    } 
    $mysqli->close(); 
    return(0); 
} 

Это функция, которая принимает этот массив и превращает его в HTML-код, который будет использоваться в качестве панели навигации.

function get_menu($menu_id) { 
    if(build_menu($menu_id)){ 
     $menu = build_menu($menu_id); 

     $menu_html = '<ul>'; 
     for($i=0; $i<count($menu); $i++){ 
      $menu_item_path = ($menu[$i]['path'] != NULL ? $menu[$i]['path'] : '#'); 
      $menu_html .= '<li><a href="' . $menu_item_path . '">' . $menu[$i]['name'] . '</a>'; 
      if(count($menu[$i])>0){ 
       $menu_html .= '<ul>'; 
       for($j=0; $j<count($menu[$i]); $j++){ 
        if(isset($menu[$i][$j])){ 
         $menu_html .= '<li>' . $menu[$i][$j]['name'] . '</li>'; 
        } 
       } 
       $menu_html .= '</ul>'; 
      } 
      $menu_html .= '</li>'; 
     } 
     $menu_html .= '</ul>'; 

     return($menu_html); 
    } 
    } 

я предположил, что if(count($menu[$i])>0) будет считать количество элементов массива внутри выбранного элемента, но по какой-то причине, он считает ключи и, следовательно, всегда верно.

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

ответ

0

использование array_filter рассчитывать только элементы в массиве не пустые или нулевой

+0

Не могли бы вы объяснить немного больше? Я не понимаю. Я пытаюсь проверить, существует ли массив внутри элемента массива. –

+0

Я нашел исправление. Вместо подсчета «sub-array», я просто проверил, действительно ли 'isset ($ menu [$ i] [0])' возвращает true, доказывая, что существует «подматрица». –

0

Процесс создания меню HTML может быть намного проще, чем ваш пример.

function generateMenu(array $menu, $parentId = 0) { 
    if (!isset($menu[$parentId])) { 
     return; 
    } 
    $output = '<ul>'; 
    foreach ($menu[$parentId] as $record) { 
     $output .= '<li>'; 
     $output .= '<a href="#">' . $record['title'] . '</a>'; 
     $output .= generateMenu($menu, $record['id']); 
     $output .= '</li>'; 
    } 
    $output .= '</ul>'; 
    return $output; 
} 

echo generateMenu($menu); 

Приведенный выше код будет выход HTML, как:

x First level #1 
    o Second level #8 
x First level #2 
    o Second level #4 
     - Third level #6 
     - Third level #7 
    o Second level #5 
x First level #3 

demo

Но для того, чтобы работать, вы должны исправить build_menu() функцию, чтобы вернуть массив как this, который очень просто создайте один массив $menu и заполните его как $menu[$row['parent_id']][] = $row;, где $row - это строка записи, извлеченная из базы данных аза.

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