[PHP] Função recursiva

iMP-

Membro
Boas! estou a fazer um catalogo... mas para adicionar produtos nesse catalogo precisava de uma combobox do seguinte genero:


Computadores
____- Desktops
_______- Pretos
_______- Brancos
____- Portateis
_______- Castanhos

(os underscores é só pq nao da espaço)
Tenho isto tudo introduzido na base de dados, não sei como fazer para mostrar dessa forma....

alguma sugestão?
 
Exemplo base dados (tabela: lista_produtos)

id | id_mae | nome_produto

Exemplo de 3 prdoutos

1 | 0 | Motherboards
2 | 1 | DFI
3 | 0 | Processadores


PHP:
$categorias_mae = MYSQL_QUERY("SELECT * FROM lista_produtos WHERE id_mae='0'");

Enquanto corres o array dos dados do while, ex.

PHP:
while ($d = mysql_fetch_assoc($categorias_mae)) {

$sub_categorias = MYSQL_QUERY("SELECT * FROM lista_produtos WHERE id_mae='".$d['id']."'");

}


É claro que por esta altura dava jeito, criares uma funcao que verifique se existem, e que faca o select até ao fim das categorias.
 
A base de dados ja esta feita, ja mostra o catalogo, so que eu ao mostrar o catalogo tenho por ex Computadores e tenho que clicar para me aparecer os filhos, o que eu pretendo é uma combobox que me mostre por ordem?
Pai(1)
_filho(1)
__neto(1)
_filho(1)
Pai(2)
_filho(2)
_filho(2)

se é que me faço entender
 
Tens a solução do OPTGROUP (http://www.w3schools.com/tags/tag_optgroup.asp - que eu penso que não faça os 3ºs níveis, mas não tenho a certeza) e tens a solução dos espaços:
Código:
<html>
    <head>
        <title>combo</title>
    </head>
    <body>
        <select name='tree'>
            <option>Pai 1</option>
            <option>&nbsp;&nbsp;&nbsp;Filho 1.1</option>
            <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 1.1.1</option>
            <option>&nbsp;&nbsp;&nbsp;Filho 1.2</option>
            <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 1.2.1</option>
            <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 1.2.2</option>
            <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 1.2.3</option>
            <option>Pai 2</option>
            <option>&nbsp;&nbsp;&nbsp;Filho 2.1</option>
            <option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Neto 2.1.1</option>
        </select>
    </body>
</html>
 
a solução do optgroup era o que lhe ia sugerir á bocado, mas testei e só funciona com um nível. quando se tenta por uma dentro aparecem como 2 níveis diferentes.
vai ter que ser mesmo com espaços e com uma verificação para impedir de clicar nos supostos títulos

mas acho que é melhor dares mais pormenores, tipo como está estruturada essa parte da base de dados. as secções pai estão na mesma tabela das secções filho e por ai adiante ou estão em tabelas diferentes. se estão em diferentes como é as associaste, etc
 
Última edição:
tabelaex7.jpg


a 1ª é a minha tabela a 2ª será a minha combo box pretendida, algo do genero...
 
Pegando nas ideias do slack_guy e do hostmake vê se isto te ajuda em alguma coisa:


PHP:
<?php
//construir dropdown
function BuildDDList(){
  return "<select name='ddListOptions'>"._BuildDDListItems()."</select>";
}

//construir item da dropdown
function _BuildDDListItems($parent=0, $level=0, $db_cnn=null){
  $indent = "";
  if(!$db_cnn){$db_cnn=_connectDB();} 

  for ($i=0; $i<$level; $i++){
    $indent.= "&nbsp; &nbsp;"; //fazer indentação com 3 espaços
  }

  $sql = mysql_query("Select `id`,`nome` From `lista_produtos` Where `pai`='$parent'",$db_cnn);
  while ($myrow = mysql_fetch_array($sql)){
    //menu root não tem prefixo
    $prefix=($level>0)?"-&nbsp;":"";
    //construir item
    $items.="<option value='$myrow[id]'>$indent$prefix$myrow[nome]</option>";
    //chamar recursivamente a função
    $items.=_BuildDDListItems($myrow["id"], $level+1,$db_cnn);
  }

  return $items;
}

//ligação à BD
function _connectDB(){
  $db = mysql_connect("localhost", "root", "");
  mysql_select_db("my_database",$db) or die("Impossivel aceder à BD");
  return $db;
}


//imprimir dropdown
echo BuildDDList();
 
Back
Topo