Ben en uygun ağaç çözüm bulmak için komşuluk listesi ve İç İçe Seti Modeli içine bakarak edilmiştir.
Şimdiye kadar ben İçiçe Set Modeli başlıca avantajlarından biri ben tam bir ağacı almak için bir SQL sorgusu ve bazı kod kullanabilirsiniz olduğunu düşündüm. Ama / insert düğümleri ve bütün ağaç kolayca bozuk alabilirsiniz güncellemek için karmaşıktır.
Sonra bu iki direğin üzerinde tökezledi:
Recursive categories with a single query?
http://www.sitepoint.com/forums/showthread.php?t=570360
Aşağıdaki kod bana tek bir SQL sorgusu ile komşuluk listesi kullanmanızı sağlar. Bu komşuluk listesi bozuk bütün ağacına güncellemek için daha kolay ve daha az olası olduğunu bana görünüyor.
What do you think about this code?
Ağaç yapısını yansıtacak bir çok boyutlu bir dizi oluşturmak
$nodeList = array();
$tree = array();
$query = mysql_query("SELECT id, title, page_parent FROM categories ORDER BY page_parent");
while($row = mysql_fetch_assoc($query)){
$nodeList[$row['id']] = array_merge($row, array('children' => array()));
}
mysql_free_result($query);
foreach($query AS $row){
$nodeList[$row['id']] = array_merge($row, array('children' => array()));
}
foreach ($nodeList as $nodeId => &$node) {
if (!$node['page_parent'] || !array_key_exists($node['page_parent'], $nodeList)) {
$tree[] = &$node;
} else {
$nodeList[$node['page_parent']]['children'][] = &$node;
}
}
unset($node);
unset($nodeList);
Iç içe düğümler ile bir Sırasız liste hazırlayın
function printMenu ($arrTreeToTraverse, $ext = '.html', $breadcrumb = '') {
// Pre loop stuff
echo "<ul class=\"sf-menu\">\r\n";
foreach ($arrTreeToTraverse as $objItem) {
// Stuff relevant to the item, before looping over its children
if ($objItem['page_parent'] != 0) {
$breadcrumb .= '/'.$objItem['uri'];
}
else
{
$breadcrumb .= $objItem['uri'];
}
if ($objItem['uri'] == 'index') {
echo '<li><a href="/">'.$objItem['title'].'</a>';
} else {
echo '<li><a href="'$_SERVER['SERVER_NAME'].'/'.$breadcrumb.$ext.'">'.$objItem['title'].'</a>';
}
if ($objItem['children']) {
echo "\r\n";
// Call the function again on the children
printMenu($objItem['children'], $ext, $breadcrumb);
}// if
// Extend breadcrumb if it is a child or
// reset breadcrumb if first level of tree
$parent = explode('/', $breadcrumb);
if ($objItem['page_parent'] != 0) {
$breadcrumb = $parent[0];
} else {
$breadcrumb = '';
}
echo "</li>\r\n";
}// foreach
// Post loop stuff
echo "</ul>\r\n";
}// function
printMenu($navigation, '.html');