kdz 0 Denunciar post Postado Novembro 1, 2009 Olá, gostaria muito de ajuda :) Quero exibir um menu de Produtos e SubProdutos. Tabela Produtos - Cadastrei alguns dados de exemplo: IdCategoria - IdCategoriaPai - Nome (1, 0, 'Periféricos'), (2, 0, 'Software'), (3, 1, 'Teclado'), (4, 1, 'Mouse'), (5, 2, 'Windows'), (6, 2, 'Linux'), (7, 6, 'Debian') (8, 6, 'Kurumin') Preciso que o script liste todas as categorias e logo abaixo suas subcategorias independente de quantos níveis existirem. Eu consegui fazer isso com dois níveis, mas no terceiro não consegui. E nesse meu modo não é automático, eu teria que ficar repetindo linhas e linhas de código. $sql = mysql_query('SELECT * FROM categorias WHERE CategoriaPai=0'); while($x = mysql_fetch_array($sql)) { echo $x['Nome'] . '<br>'; $sql2 = mysql_query('SELECT * FROM categorias WHERE CategoriaPai='.$x['IdCategoria'].''); while($y = mysql_fetch_array($sql2)) { echo '-> ' . $y['Nome'] . '<br>'; } } Alguém pode me ajudar? Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Novembro 1, 2009 Escrevi um post sobre isso recentemente, em meu blog, mas o servidor está em manutenção. Vou postar a parte importante, que resolverá seu problema: Uso a mesma lógica do seu exemplo: id_pai == 0 se for categoria principal Vamos fazer uma seleção dessas informações e colocá-las num arrray, como o exibido abaixo. Não vou postar código para seleção, pois, além de ser algo extremamente simples, não quero me ater a SGBD's específicos. // array com as categorias do banco de dados $cats[1]['id_pai'] = 0; $cats[1]['nome'] = 'A Empresa'; $cats[2]['id_pai'] = 1; $cats[2]['nome'] = 'Sobre Nós'; $cats[3]['id_pai'] = 1; $cats[3]['nome'] = 'Objetivo'; $cats[4]['id_pai'] = 3; $cats[4]['nome'] = 'Objetivos dos Nossos Clientes'; $cats[5]['id_pai'] = 0; $cats[5]['nome'] = 'Contato'; $cats[6]['id_pai'] = 0; $cats[6]['nome'] = 'Produtos'; Note que o array não começou em zero. Os índices do array são os ID’s das categorias no banco de dados. Se começasse em zero, causaria conflito com o id_pai, que é zero para categorias principais. Agora postarei uma função simples em PHP que montará o menu completo. /** * Função que monta o menu com as categorias e subcategorias. * @param id_pai ID da categoria pai cujas subcategorias serão buscadas. * @param ArrayCats Array com as categorias do menu. */ function montaMenu( $id_pai, $arrayCats ) { // calcula o número de índices do array $catsSize = count( $arrayCats ); echo "<ul>"; for ( $i = 1; $i <= $catsSize; $i++ ) { if ( $arrayCats[ $i ]['id_pai'] == $id_pai ) { echo "<li>"; echo $arrayCats[ $i ]['nome']; // busca as subcategorias da categoria atual montaMenu( $i, $arrayCats ); echo "</li>"; } } echo "</ul>"; } Você pode usar duas variáveis globais, se quiser: o array das categorias e a variável $catsSize. Isso reduz o processamento, uma vez que a função count() seria chamada apenas uma vez. Porém, para projetos grandes, com diversos menus, essa prática não seria bem-vinda. Para exibir o menu, basta chamar a função da seguinte forma: montaMenu( 0, $cats ); Compartilhar este post Link para o post Compartilhar em outros sites
kdz 0 Denunciar post Postado Novembro 2, 2009 Sencacional! Era isso mesmo que eu precisava! Mas como eu sou mtu noob, não estou conseguindo fazer o array retornar naquele padrão :( // Padrão da função Array ( [1] => Array ( [id_pai] => 0 [nome] => A Empresa ) } // Meu retorno - ta faltando um array :s Array ( [id_pai] => 0 [nome] => A Empresa ) Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Novembro 2, 2009 Como ficou o seu código? Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites