Pergunta

Portanto, o menu final será parecido com este:

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

Com base nos seguintes registros DB:

id        menu_title          parent_menu_id    menu_level    weight
1         Item A                0                           1                     1
2         Item B                0                           1                     0
3         Item C                0                           1                     2
4         SubItem A-2       1                           2                     1
5         Item B-1             2                           2                     0
6         Item B-1-1          5                           3                     1
7         SubItem A-1       1                           2                     0
8         Item B-1-2          5                           3                     0

Como eu iria sobre a exibição? Meu palpite é que vai envolver o armazenamento de todos os itens em uma matriz multidimensional, em seguida, loop através de alguma forma ...

Foi útil?

Solução

Lidar com a estrutura de dados como você tê-lo, muitas vezes, envolvem recursão ou várias consultas para construir a árvore.

Você considerou outras formas de armazenar uma hierarquia? Confira travessia pré-encomenda modificado - aqui está uma boa PHP artigo baseado sobre este .

Outras dicas

dados hierárquica é um pouco irritante em um banco de dados relationsal (excluindo Oracle, que tem operadores em START WITH/CONNECT BY para lidar com isso). Existem basicamente dois modelos :. Lista de adjacência e conjuntos aninhados

Você optou conjuntos de adjacência, que é o que eu normalmente fazer também. É muito mais fácil de mudar do que o modelo de conjunto aninhado, embora o modelo de conjunto aninhado podem ser recuperadas na ordem correta em uma única consulta. listas de adjacência não pode ser. Você vai precisar para construir uma estrutura de dados intermediário (árvore) e, em seguida, convertê-lo em uma lista.

O que eu faria (e ter feito recentemente na verdade) é:

  • selecione todo o conteúdo do menu em uma consulta ordenada pelo ID pai;
  • Criar uma árvore da estrutura do menu utilizando arrays associativos ou classes / objetos;
  • A pé daquela árvore para criar listas não ordenadas aninhados; e
  • Use um jQuery plug-in como Superfish para transformar essa lista em um menu.

Você constrói algo como isto:

$menu = array(
  array(
    'name' => 'Home',
    'url' => '/home',
  ),
  array(
    'name' => 'Account',
    'url' => '/account',
    'children' => array(
      'name' => 'Profile',
      'url' => '/account/profile',
    ),
  ),
  // etc
);

e convertê-lo em esta:

<ul class="menu">;
  <li><a href="/">Home</a></li>
  <li><a href="/account">Account Services</a>
    <ul>
      <li><a href="/account/profile">Profile</a></li>
...

O PHP para gerar a matriz de menu a partir é razoavelmente simples, mas um pouco finnicky para resolver. Você usa uma função tree-curta recursiva que constrói a lista aninhada marcação HTML, mas vai deixá-lo de implementação como um exercício para o leitor. :)

A forma como os seus dados hierárquica armazenamento não é tão eficiente quanto você pode querer. Eu li o artigo Gerenciamento de dados hierárquicos em MySQL há alguns anos atrás e, desde então, encontrou-o como o melhor solução para gerenciamento de dados de hierarquia baseada em SQL. Próxima melhor benefício é que eu acredito que você pode pegar a árvore inteira com uma consulta.

Eu só postou uma pergunta semelhante a minha própria abordagem para transformar dados hierárquicos MySQL (lista de adjacência) em um menu (HTML)

Ele faz não uso recursão. E isso requer um única consulta para o banco de dados.

Leia mais em

https://stackoverflow.com/questions/2871861#3368622

Graças.

Outra forma simples você pode gerar hierarquia, se você não quiser usar conjuntos aninhados é usar uma cadeia de texto simples na frente.

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

Se tornaria

1 Item B
  1.1 Item B1
    1.1.1 Item B11
    1.1.2 Item B12
2 Item A
  2.1 Item A1
  2.2 Item B2
3 Item C

O dígito na frente de cada item pode ser armazenado em um campo e analisado com base no comprimento (representando a profundidade de onde é) para lhe dizer tudo o que você precisa saber sobre onde ele vai.

Eu uso hierarquias conjunto aninhado para o material mais complicado que requer cálculo, e tc, mas acho que esta abordagem tem servido bem

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top