2009-02-05 9 views
5

मेरे पास एक पदानुक्रम में वस्तुओं का एक सेट है। एक शीर्ष "रूट" नोड है और इसमें बाल नोड्स हैं, जो बदले में बच्चे नोड्स हैं। मैं इस संरचना को नेस्टेड सेट मॉडल का उपयोग करके डीबी में सहेजने की कोशिश कर रहा हूं, जहां प्रत्येक नोड के प्रत्येक "पक्ष" को परिभाषित करने के लिए गिना जाता है Managing Hierarchical Data in MySQL में के रूप में पदानुक्रम,:PHP रिकर्सिवइटरेटरइटरेटर और नेस्टेड सेट

alt text http://dev.mysql.com/tech-resources/articles/hierarchical-data-4.png

मेरे समस्या छोड़ दिया और सही मूल्यों की गणना की जाती है। मैं आमतौर पर पदानुक्रम पर पुनरावृत्ति करने के लिए रिकर्सिवइटरेटर इटरेटर का उपयोग करता हूं, लेकिन मैं संदर्भित नहीं कर सकता कि संख्याओं की गणना करने के बिना किसी रिकर्सिव फ़ंक्शन का उपयोग किए बिना संदर्भित किया जा सकता है जो संदर्भ द्वारा इंडेक्स वैरिएबल को पार करता है।

कोई भी विचार?

यह किसी काम का नहीं शायद है, लेकिन यह (गलत) कोड मैं वर्तमान में है:

$iterator = new RecursiveIteratorIterator(
    new Node_List(array($root)), 
    RecursiveIteratorIterator::SELF_FIRST); 

$i = 0;  
foreach ($iterator as $node) { 
    $node->left = ++$i; 
    $node->right = ++$i; 
} 

आप देख सकते हैं, जो कुछ इस तरह देना होगा:

Node 
    Node 
    Node 

वामपंथियों और का सही मान:

Node (1, 2) 
    Node (3, 4) 
    Node (5, 6) 

जब वे किया जाना चाहिए:

Node (1, 6) 
    Node (2, 3) 
    Node (4, 5) 

उत्तर

4

मैं यह पता लगा, यहाँ समाधान (SIMPLIFED) बताया गया है:: आप निम्नलिखित की तरह कुछ की जरूरत है

$iterator = new RecursiveIteratorIterator(
    new Site_Node_List(array($root)), 
    RecursiveIteratorIterator::SELF_FIRST); 

$sides = array(); 
$s = 0; 
$i = 0; 
$parents = array(); 
foreach ($iterator as $item) { 
    $js = array_splice($parents, $depth, count($parents), array($i)); 
    foreach (array_reverse($js) as $j) { 
     $sides[$j]['right'] = ++$s; 
    } 
    $sides[$i]['left'] = ++$s; 
    $i++; 
} 
foreach (array_reverse($parents) as $j) { 
    $sides[$j]['right'] = ++$s; 
} 

यह अपने वास्तविक कोड का सरलीकृत संस्करण से अधिक बजे है, क्योंकि यह सिर्फ संग्रहीत करता है " पक्ष "एक अलग सरणी में मान, लेकिन यह सिद्धांत का प्रदर्शन करता है।

मूल विचार यह है कि आप किसी सरणी में सभी अभिभावक नोड्स (गहराई से ट्रैक द्वारा ट्रैक) स्टोर करते हैं, और केवल अपने लूप में "बाएं" मान लिखते हैं। फिर, जब गहराई कम हो जाती है तो इसका मतलब है कि आप पदानुक्रम का बैक अप ले चुके हैं, इसलिए माता-पिता सरणी को उन लोगों को हटाने के लिए विभाजित किया गया है जो अब प्रासंगिक नहीं हैं, और वे "दाएं" मानों को सेट करने के विपरीत (विपरीत में) हैं। अंत में, आपको अंत में शेष माता-पिता पर लूप करना होगा।

0

रिकर्सन के बिना इस समस्या को हल करना संभव नहीं है।

function tag_recursive($node, &$number) { 
    $node->left = $number++; 
    foreach ($node->children as &$child) { 
     tag_recursive($child, $number); 
    } 
    $node->right = $number++; 
} 

function tag($node) { 
    $number = 1; 
    tag_recursive($node, $number); 
    // $number is now highest id + 1 
} 
संबंधित मुद्दे