Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou com dificuldade em realizar a construção de um menu infinito e gostaria de uma ajuda.
Problema:
Imagine a seguinte situação: Tenho duas tabelas:
1 Tabela -
ID_MENU
ID_MENU_PAI
NAME
LINK
2 TABELA
ID MENU PAI
ID MENU FILHO (ID MENU TABELA1)
O fato da segunda tabela existir é que um mesmo "submenu" pode estar em um outro menu diferente, ou seja o menu de cadastro de usuário pode estar ao mesmo tempo no Admin ou em um menu Cliente sem que seja cadastrado duas vezes na Tabela 1.
Se eu fizer um select na tabela 1 eu consigo trazes todos os menus com seus respectivso pais:
[7] => Array
(
[0] => Array
(
[ID] => 26
[NAME] => Projects
[LINK] => #
)
)
[48] => Array
(
[0] => Array
(
[ID] => 4
[NAME] => Departments
[LINK] =>
)
)
[36] => Array
(
[0] => Array
(
[ID] => 37
[NAME] => Customers
[LINK] => #
)
[1] => Array
(
[ID] => 38
[NAME] => Items
[LINK] => #
)
)
[47] => Array
(
[0] => Array
(
[ID] => 9
[NAME] => Test
[LINK] => #
)
[1] => Array
(
[ID] => 46
[NAME] => Test2
[LINK] => #
)
)
O problema é que na tabela 2 eu tenho a seguinte relação:
ID_MENU_PAI ID_MENU_FILHO
7 26
7 48
48 4
36 37
36 38
48 47
47 9
47 46
36 46
Ou seja eu tenho que consultar a tabela 2 e montar o array para ficar dessa forma:
[7] => Array
(
[0] => Array
(
[ID] => 26
[NAME] => Projects
[LINK] => #
)
[48] => Array
(
[0] => Array
(
[ID] => 4
[NAME] => Departments
[LINK] => #
)
[47] => Array
(
[0] => Array
(
[ID] => 9
[NAME] => Test
[LINK] => #
)
[1] => Array
(
[ID] => 46
[NAME] => Test2
[LINK] => #
)
)
)
)
[36] => Array
(
[0] => Array
(
[ID] => 37
[NAME] => Customers
[LINK] => #
)
[1] => Array
(
[ID] => 38
[NAME] => Items
[LINK] => #
)
[2] => Array
(
[ID] => 46
[NAME] => Test2
[LINK] => #
)
)
Notem que o 46 aparece em dois lugares um sendo o terceiro nivel e outro o primeiro nivel.
Alguém tem alguma idéia de como fazer isso??
Desde já agradeço
ExtremsX, muito obrigado pela ajuda!
Então do jeito que posto funcionou, porém ainda tenho uma dúvida:
No print_r(criarArvore(null)); no null eu devo colocar o id do menu principal?
Como eu devo descarregar, porque só funcionou quando eu coloco um ID pai principal.
Mais uma vez agradeço
Se você quiser imprimir só uma parte, você passa um ID, caso contrario coloque null para imprimir tudo
Quando eu passo null ele não imprime nada..
Quando eu passo um ID de um menu principal ai sim ele imprime.
Veja como ficou:
Menu:
Array
(
[26] => Array
(
[ID] => 26
[NAME] => Projetos
)
[37] => Array
(
[ID] => 37
[NAME] => Clientes
)
[38] => Array
(
[ID] => 38
[NAME] => Item
)
[39] => Array
(
[ID] => 39
[NAME] => Vendedor
)
[40] => Array
(
[ID] => 40
[NAME] => Perfil
)
[9] => Array
(
[ID] => 9
[NAME] => Teste
)
[46] => Array
(
[ID] => 46
[NAME] => Tëste2
)
[4] => Array
(
[ID] => 4
[NAME] => Departamento
)
[8] => Array
(
[ID] => 8
[NAME] => Teste4
)
[41] => Array
(
[ID] => 41
[NAME] => Teste 5
)
[44] => Array
(
[ID] => 44
[NAME] => Teste 6
)
[42] => Array
(
[ID] => 42
[NAME] => Teste 7
)
[43] => Array
(
[ID] => 43
[NAME] => Teste 8
)
[45] => Array
(
[ID] => 45
[NAME] => Teste 9
)
[50] => Array
(
[ID] => 50
[NAME] => Teste10
)
)Array
(
[0] => Array
(
[pai_id] => 36
[filho_id] => 39
)
[1] => Array
(
[pai_id] => 36
[filho_id] => 40
)
[2] => Array
(
[pai_id] => 36
[filho_id] => 37
)
[3] => Array
(
[pai_id] => 36
[filho_id] => 38
)
[4] => Array
(
[pai_id] => 7
[filho_id] => 48
)
[5] => Array
(
[pai_id] => 7
[filho_id] => 49
)
[6] => Array
(
[pai_id] => 49
[filho_id] => 47
)
[7] => Array
(
[pai_id] => 48
[filho_id] => 8
)
[8] => Array
(
[pai_id] => 48
[filho_id] => 41
)
[9] => Array
(
[pai_id] => 48
[filho_id] => 4
)
[10] => Array
(
[pai_id] => 48
[filho_id] => 44
)
[11] => Array
(
[pai_id] => 49
[filho_id] => 42
)
[12] => Array
(
[pai_id] => 49
[filho_id] => 43
)
[13] => Array
(
[pai_id] => 49
[filho_id] => 45
)
[14] => Array
(
[pai_id] => 47
[filho_id] => 46
)
[15] => Array
(
[pai_id] => 7
[filho_id] => 26
)
[16] => Array
(
[pai_id] => 36
[filho_id] => 51
)
[17] => Array
(
[pai_id] => 51
[filho_id] => 50
)
[18] => Array
(
[pai_id] => 47
[filho_id] => 9
)
)
Era isso? Quando eu chamo com um ID PAi ele imprime, se eu passo null não;
Obrigado mais uma vez
Veja a minha variável $ligacoes. Ela tem duas array no qual o pai_id está null, organize dessa forma seus menus que vai dar para chamar o criarArvore(null)
Falha minha!
Funcionou!
Muito obrigado ExtremsX
Sei que já esta resolvido esse tópico, porem acho q devo compartilhar com voces essa classe que eu obtive na internet
class Menu
{
public function gerarMenu($parent, $array)
{
$has_children = false;
$str = "";
foreach ($array as $key => $value) {
if ($value ['idpai'] == $parent) {
if ($has_children === false && $parent) {
$has_children = true;
$str .= '<ul class="nav">' . "\n";
}
if (isset ($value ['classe'])) {
$classe = " class='" . $value ['classe'] . "'";
} else {
$classe = "";
}
$str .= '<li' . $classe . '>' . "\n";
if ($value ['link'] == '') {
$value ['link'] = "javascript:void(0)";
}
$filho = array_key_exists($parent,$array) ? "" : " <i class='caret'></i>";
$str .= '<a' . $classe . ' href="' . $value ['link'] . '">' . $value ['titulo'] .$filho. '</a> ' . "\n";
$str .= "\n";
$str .= $this->gerarMenu($key, $array);
$str .= "</li>\n";
}
}
if ($has_children === true && $parent)
$str .= "</ul>\n";
return $str;
}
function exemploGerarMenu()
{
$nested = array();
$nested [1] = array(
"link" => "",
"idpai" => 0,
"titulo" => "Page 1"
);
$nested [2] = array(
"link" => "",
"idpai" => 0,
"titulo" => "Page 2"
);
$nested [3] = array(
"link" => "",
"idpai" => 1,
"titulo" => "Page 3"
);
$nested [4] = array(
"link" => "",
"idpai" => 2,
"titulo" => "Page 4"
);
$nested [5] = array(
"link" => "",
"idpai" => 1,
"titulo" => "Page 5"
);
$nested [6] = array(
"link" => "",
"idpai" => 2,
"titulo" => "Page 6"
);
return $this->gerarMenu(0, $nested);
}
}Amigos aproventando
Como eu faço para imprimir isso em ul e li em recursivamente, como se eu fosse imprimir o meu menu..
Array
(
[7] => Array
(
[0] => Array
(
[NAME] => Menu Principal 1
)
[26] => Array
(
[ID] => 26
[NAME] => Tset
[LINK] => #
)
[48] => Array
(
[0] => Array
(
[NAME] => tessss
)
[8] => Array
(
[ID] => 8
[NAME] => Teste 01
[LINK] => #
)
[41] => Array
(
[ID] => 41
[NAME] => tesssssssss
[LINK] =>#
)
[4] => Array
(
[ID] => 4
[NAME] => ola teste
[LINK] =>#
)
[44] => Array
(
[ID] => 44
[NAME] => testando
[LINK] =>#
)
)
[49] => Array
(
[0] => Array
(
[NAME] => Teste Menu
)
[42] => Array
(
[ID] => 42
[NAME] => Teste 1
[LINK] =>#
)
[43] => Array
(
[ID] => 43
[NAME] => Teste 2
[LINK] =>#
)
[45] => Array
(
[ID] => 45
[NAME] => Teste 3
[LINK] =>#
)
[47] => Array
(
[0] => Array
(
[NAME] => Menu Tese
)
[9] => Array
(
[ID] => 9
[NAME] => Teste 4
[LINK] =>#
)
[46] => Array
(
[ID] => 46
[NAME] => Teste 5
[LINK] =>#
)
)
)
)
[36] => Array
(
[0] => Array
(
[NAME] => Menu Principal 2
)
[37] => Array
(
[ID] => 37
[NAME] => Teste 7
[LINK] =>#
)
[8] => Array
(
[ID] => 8
[NAME] => Teste 01
[LINK] =>#
)
[38] => Array
(
[ID] => 38
[NAME] => Testee
[LINK] =>#
)
[51] => Array
(
[0] => Array
(
[NAME] => Teste sub
)
[50] => Array
(
[ID] => 50
[NAME] => Teste subb
[LINK] =>#
)
)
)
)<?php
$menus = [
31 => ['id' => 31, 'nome' => 'Menu 1'],
32 => ['id' => 32, 'nome' => 'Menu 2'],
33 => ['id' => 33, 'nome' => 'Menu 3'],
34 => ['id' => 34, 'nome' => 'Menu 4']
];
$ligacoes = [
['pai_id' => null, 'filho_id' => 31],
['pai_id' => null, 'filho_id' => 33],
['pai_id' => 31, 'filho_id' => 32],
['pai_id' => 31, 'filho_id' => 33],
['pai_id' => 32, 'filho_id' => 33],
['pai_id' => 32, 'filho_id' => 34]
];
// Cria as ligações
$index = [];
foreach($ligacoes as $id => $ligacao) {
if (!isset($index[$ligacao['pai_id']]))
$index[$ligacao['pai_id']] = [];
$index[$ligacao['pai_id']][] = $ligacao['filho_id'];
}
// Cria a arvore
$arvore = [];
function criarArvore($pai_id) {
global $index, $menus;
$array = [];
if (isset($index[$pai_id])) {
foreach($index[$pai_id] as $filho_id) {
$filhos = criarArvore($filho_id);
if ($filhos) {
$array[$filho_id][] = $menus[$filho_id];
$array[$filho_id] += $filhos;
} else {
$array[$filho_id] = $menus[$filho_id];
}
}
}
return $array;
}
function imprimirArvore($pai_id) {
global $index, $menus;
$html = '';
// Verifica se menus a serem impressos
if (isset($index[$pai_id])) {
foreach($index[$pai_id] as $id) {
$menu = &$menus[$id];
// Verifica se existe filhos e imprime como pasta
if (isset($index[$menu['id']])) {
$html .= "<li><a href=\"#\">{$menu['nome']}</a></li>";
$html .= "<ul>" .imprimirArvore($menu['id']) . "</ul>";
}
// Caso contrario inprimi como arquivo
else {
$html .= "<li><a href=\"#\">{$menu['nome']}</a></li>\n";
}
}
}
return $html;
}
$arvore = criarArvore(null);
echo '<ul>' . imprimirArvore(null) . '</ul>';Obrigado!
Adapte e tente isso por favor:
<?php
$menus = [
$ligacoes = [
// Cria as ligações
// Cria a arvore