2010-05-23 15 views
6

जब MySQL से एक सौपानिक संरचना को पुन: प्राप्त (एक आईडी स्तंभ और एक माता पिता स्तंभ श्रेणीबद्ध संबंधों वाचक के साथ तालिका), मैं परिणाम एक enumerated सरणी के रूप में निम्नानुसार में नक्शा (इस उदाहरण के लिए संख्या मनमाना हैं):PHP सरणी - नेस्टेड बहुआयामी सरणी में 1-आयामी सरणी कैसे करें?

Array ([3] => Array ([7] => Array()), [7] => Array ([8] => Array())) 

नोटिस 3 7 का अभिभावक है, और 7 8 का अभिभावक है (यह आगे बढ़ सकता है; और किसी भी माता-पिता के पास कई बच्चे हो सकते हैं)।

Array ([3] => Array ([7] => Array ([8] => Array()))) 

है, प्रत्येक नई आईडी स्वचालित रूप से एक खाली सरणी असाइन किया गया है:

मैं इस प्रकार एक नेस्टेड बहुआयामी सरणी में इस सरणी हटना चाहते थे। भले ही, किसी भी आईडी के बच्चों को उनके माता-पिता की सरणी में धकेल दिया जाएगा।

आगे स्पष्टीकरण के लिए निम्न उदाहरण पर एक नज़र डालें:

alt text http://img263.imageshack.us/img263/4986/array.gif

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

क्या कोई अंतर्निहित PHP कार्य है जो मुझे इसके साथ सहायता कर सकता है? क्या आपको कोई विचार है कि इसे बनाने के बारे में कैसे जाना है? इसके लायक होने के लिए मैं वर्डप्रेस में नेविगेशन बार बनाने के लिए इसका उपयोग कर रहा हूं (जिसमें श्रेणियां, उपश्रेणियां, पोस्ट ... अनिवार्य रूप से कुछ भी हो सकती है)।

+2

अच्छे ग्राफिक्स के लिए +1 :) – Alec

उत्तर

1

विचार यह है कि आप अपने सभी नोड्स (माता-पिता और बच्चे) के साथ एक सहायक सरणी रखते हैं। इस सरणी के मान संदर्भ हैं जो आपके परिणाम को वापस लेते हैं।

यह रेखीय समय में पेड़ बनाता है (array_key_exists एक हैश तालिका देखने, जो औसत हे पर है (1) करता है):

//table contains (id, parent) 
$orig = array(
    11 => 8, 
    7 => 3, 
    8 => 7, 
    99 => 8, 
    16 => 8, 
); 

$childrenTable = array(); 
$result = array(); 

foreach ($orig as $n => $p) { 
    //parent was not seen before, put on root 
    if (!array_key_exists($p, $childrenTable)) { 
     $childrenTable[$p] = array(); 
     $result[$p] = &$childrenTable[$p]; 
    } 
    //child was not seen before 
    if (!array_key_exists($n, $childrenTable)) { 
     $childrenTable[$n] = array(); 
    } 

    //root node has a parent after all, relocate 
    if (array_key_exists($n, $result)) { 
     unset($result[$n]); 
    } 

    $childrenTable[$p][$n] = &$childrenTable[$n]; 
} 
unset($childrenTable); 

var_dump($result); 

देता

array(1) { 
    [3]=> 
    array(1) { 
    [7]=> 
    array(1) { 
     [8]=> 
     array(3) { 
     [11]=> 
     array(0) { 
     } 
     [99]=> 
     array(0) { 
     } 
     [16]=> 
     array(0) { 
     } 
     } 
    } 
    } 
} 

संपादित करें: सेट नहीं $childrenTable में संदर्भ झंडे स्पष्ट करने के लिए अंत। प्रैक्टिस में, आप शायद किसी भी फ़ंक्शन के अंदर ऑपरेशन करना चाहेंगे।

+0

प्रयास के लिए धन्यवाद, मैं अब यह देखने के लिए देख रहा हूं कि यह वास्तव में बुलेटप्रूफ है या नहीं। – Gal

1

यह प्रश्न और इसका उत्तर आपके लिए उपयोगी होना चाहिए: turn database result into array

@ बिल करविन द्वारा विशेष रूप से क्लोजर तालिका के विषय में पीडीएफ प्रस्तुतिकरण को पढ़ना सुनिश्चित करें।

संबंधित मुद्दे