Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

kdz

While infinito enquanto houver

Recommended Posts

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.