我的資料庫結構如下
cid pid name
1 0 aa
2 1 bb
3 2 cc
4 1 dd
要如何寫出如下的html
<select name="pid">
<option value="0">----</option>
<option value="1">aa</option>
<option value="2">-bb</option>
<option value="3">---cc</option>
<option value="4">-dd</option>
</select>
這樣?
<select name="pid">
<option value="0">----</option>
<?php foreach($array as $obj){ ?>
<option value="<?php echo $obj['pid']; ?>">
<?php echo $obj['name']; ?>
</option>
<?php } ?>
</select>
思路很簡單,沿著階層往下找...
先列出第一階層也就是 pid=0 的資料 => cid=1
接著找出 cid=1 底下的分支(pid=1的資料) => cid=2,4
同上再找出 cid=2,4 各自底下的分支(pid=2,4的資料) =>...以此類推,形成遞迴
因此可列出 Recursive function 如下
function _getBranches( $data_arr, $pid=0, $level=0 ){
$level++;
foreach( $data_arr as $row ){
if( $row['pid']===$pid ){ // 只列出該父階$pid的資料
$name = str_repeat('-',$level-1).$row['name']; // 顯示階層
echo "<option value=".$row['cid'].">$name</option>";
// 再找出底下的分支(pid=$row['cid'] )
$branches =_getBranches( $data_arr, $row['cid'], $level );
}
}
}
####
$data_arr = array(
['cid'=>1, 'pid'=>0, 'name'=>'aa',],
['cid'=>2, 'pid'=>1, 'name'=>'bb',],
['cid'=>3, 'pid'=>2, 'name'=>'cc',],
['cid'=>4, 'pid'=>1, 'name'=>'dd',],
// ['cid'=>9, 'pid'=>7, 'name'=>'ff',],
// ['cid'=>7, 'pid'=>9, 'name'=>'ee',],
);
echo '<select name="cid" >';
echo '<option value="0" >--------</option>';
echo _getBranches( $data_arr );
echo '</select>';
另外,你可以再思考一下怎麼避免 cid=9,7 的狀況...