मैं इष्टतम पेड़ समाधान खोजने के लिए एडजेंसी सूची और नेस्टेड सेट मॉडल में देख रहा हूं।एडजैसीसी सूची बनाम नेस्टेड सेट मॉडल
अब तक मैंने सोचा था कि नेस्टेड सेट मॉडल के मुख्य लाभों में से एक यह था कि मैं एक पूर्ण पेड़ प्राप्त करने के लिए एक एसक्यूएल क्वेरी और कुछ कोड का उपयोग कर सकता था। लेकिन यह अद्यतन/डालने के लिए जटिल है नोड्स और पूरे पेड़ आसानी से दूषित हो सकता है।
तो मैं इन दोनों से भी अधिक पोस्ट ठोकर खाई:
Recursive categories with a single query?
http://www.sitepoint.com/forums/showthread.php?t=570360
निम्नलिखित कोड मुझे एक SQL क्वेरी के साथ संलग्नता सूची का उपयोग करने के लिए अनुमति देता है। ऐसा लगता है कि एडजेंसी सूची अद्यतन करना आसान है और पूरे पेड़ को भ्रष्ट करने की संभावना कम है।
इस कोड के बारे में आप क्या सोचते हैं?
वृक्ष संरचना को प्रतिबिंबित करने के
$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);
नेस्टेड नोड्स
के साथ एक बिना क्रम वाली सूची तैयार एक बहु आयामी सरणी उत्पन्न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');
'foreach ($ query AS $ पंक्ति)' के अलावा ठीक दिखता है, जिसकी आवश्यकता नहीं है और एक त्रुटि उठाएगी। – Fanis