問題はidに相対的な入れ子のレベルを推定することです。ここでは、DBの一例である:ここでは http://sqlfiddle.com/#!9/22b0d2/1テーブル再帰PHPの子のレベル?
は、PHPコードの例です:
function getCats($res){
$levels = array();
$tree = array();
$cur = array();
while($rows = mysqli_fetch_assoc($res)){
$cur = &$levels[$rows['id']];
$cur['parent_id'] = $rows['parent_id'];
$cur['name'] = $rows['name'];
if($rows['parent_id'] == 0){
$tree[$rows['id']] = &$cur;
}
else{
$levels[$rows['parent_id']]['children'][$rows['id']] = &$cur;
}
}
return $tree;
}
function getTree($arr){
$out = '';
$counter = 1;
$out .= '<ul>';
foreach($arr as $k=>$v){
$out .= '<li><a href="?id='.$k.'">'.$v['name'].'</a></li>';
if(!empty($v['children'])){
$out .= getTree($v['children']);
}
}
$out .= '</ul>';
return $out;
}
$mysql = new mysqli('localhost', 'root', '', 'testids');
$res = $mysql->query("SELECT * FROM categories ORDER BY id");
$cats = getCats($res);
echo getTree($cats);
それはこのようなものだように機能を作り直す助けてください: ちょうどからではないに見えます<ul>
であるが、<table>
からである。 id = 1
から見た場合、最初のレベルではid 2
とid 3
、2番目のレベルではid 5
であり、それはid 1
の子であるためです。
Array
(
[1] => Array
(
[parent_id] => 0
[name] => name1
[children] => Array
(
[2] => Array
(
[parent_id] => 1
[name] => name2
[children] => Array
(
[4] => Array
(
[parent_id] => 2
[name] => name4
[children] => Array
(
[5] => Array
(
[parent_id] => 4
[name] => name5
)
)
)
)
)
[3] => Array
(
[parent_id] => 1
[name] => name3
)
)
)
)
注mysqli' 'へのオブジェクト指向インターフェースは、有意に少ない冗長なコードを読みやすく、監査作り、かつ容易に時代遅れの' mysql_query'インタフェースと混同しません。手続き型スタイルに多額の投資をする前に、それを切り換える価値があります。例: '$ db = new mysqli(...)'と '$ db-> prepare(" ... ")'手続き型インタフェースはmysqli' APIが導入されたPHP 4時代のアーティファクトであり、コード。 – tadman
結果をテーブルのID列で並べ替えるには? – miknik
あなたはprint_r($ cats)できますか? –