2016-01-29 5 views
2

У меня есть SQL-таблица, содержащая идентификатор и внешний ключ, назначающий одну и ту же таблицу. Я использую это, чтобы управлять (суб) навигационными точками на веб-странице через PHP.
Получение бесконечных уровней субнавигаций

Sample

(page_id 6, конечно, должен иметь 5 для page_fs, жаль что опечатка)

Как вы можете видеть, если page_fs равен нулю, это верхний уровень, если нет, это субнавигация страницы с тем же идентификатором.

Что наиболее эффективный способ, чтобы получить список, как это, используя PHP:
Page 1
--Page 1,1
--Page 1,2
---- Страница 1.2.1
Page 2
--Page 2.1
Страница 3

Она должна поддерживать бесконечное количество слоев.

Спасибо за вашу помощь

+1

Поскольку mysql не поддерживает CTE (общие выражения таблицы), тип рекурсивного запроса, который необходимо выполнить для создания структур меню на основе, по существу, плоской таблицы, становится очень сложным. Некоторые rdbms обладают встроенными способностями «рекурсивных» способностей, без этого вам нужно усложнить работу с sql. Читайте на CTE ~ https://www.google.co.uk/search?client=firefox&q=mysql+common+table+expressions#safe=off&q=mysql+recursive+common+table+expression – RamRaider

+0

Благодарим вас за быстрый ответ. Извините, но я просто понял, что мой вопрос не был так хорошо объяснен. Мне не нужен SQL-запрос, но функция PHP. – Juggernaut

ответ

1

Я предполагаю, что наиболее эффективным способом было бы хранить position и level в базе данных. Однако, если не могут или не хотят, чтобы сделать это, вот способ, чтобы представить вашу навигацию в структуре массива:

<?php 

/* SQL: 
    SELECT * FROM `navigation` ORDER BY `page_fs` DESC, `page_id 
    result in: */ 

$sql_result = [ 
    ['page_id' => 6, 'page_fs' => 5, 'title' => 'Page 2.1' ], 
    ['page_id' => 4, 'page_fs' => 3, 'title' => 'Page 1.2.1' ], 
    ['page_id' => 2, 'page_fs' => 1, 'title' => 'Page 1.1' ], 
    ['page_id' => 3, 'page_fs' => 1, 'title' => 'Page 1.2' ], 
    ['page_id' => 1, 'page_fs' => 0, 'title' => 'Page 1' ], 
    ['page_id' => 5, 'page_fs' => 0, 'title' => 'Page 2' ], 
    ['page_id' => 7, 'page_fs' => 0, 'title' => 'Page 3' ] 

]; 


function buildNavigation($pages) { 
    $navigation = []; 

    /* this loop assign each page to its id as an index 
    * Initializing ['children'] is optional. You'll' either 
    * have for every element or only for those which 
    * actually have children .*/ 
    foreach($pages as $key => $page) { 
     $navigation[ $page['page_id'] ] = $page; 
     $navigation[ $page['page_id'] ]['children'] = []; 
    } 

    /* Bring every element as a child to its parent and unset its 
    * top level representation. */ 
    foreach($pages as $key => $page) { 
     if($page['page_fs'] > 0) { 

      $navigation[ $page['page_fs'] ][ 'children' ][] = $navigation[$page['page_id']]; 

      unset($navigation[$page['page_id']]); 
     } 
    } 

    return $navigation; 

} 
echo "<pre>"; 
print_r(buildNavigation($sql_result)); 
echo "<pre>"; 
?> 

С этой структурой простая рекурсивная функция может транспортировать эту структуру в желаемом выходе HTML ,

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