2010-07-16 16 views
7

में कनवर्ट करें मेरे पास पेड़ डेटा (मूल आईडी द्वारा) के साथ एक सरणी है। मैं इसे बहुआयामी सरणी में परिवर्तित करना चाहता हूं। इसे प्राप्त करने का सबसे अच्छा तरीका क्या है? क्या इसके लिए कोई छोटा काम है?फ्लैट सरणी को बहु-आयामी

स्रोत सरणी:

$source = array(
    '0' => array(
      'Menu' => array(
        'id' => 45 
        'name' => 'Home' 
        'parent_id' => 1 
      ) 
    ) 
    '1' => array(
      'Menu' => array(
        'id' => 47 
        'name' => 'Get started' 
        'parent_id' => 1 
      ) 
    ) 
    '2' => array(
      'Menu' => array(
        'id' => 72 
        'name' => 'Attributes' 
        'parent_id' => 71 
      ) 
    ) 
    '3' => array(
      'Menu' => array(
        'id' => 73 
        'name' => 'Headings' 
        'parent_id' => 71 
      ) 
    ) 
    '4' => array(
      'Menu' => array(
        'id' => 75 
        'name' => 'Links' 
        'parent_id' => 71 
      ) 
    ) 
    '5' => array(
      'Menu' => array(
        'id' => 59 
        'name' => 'Images' 
        'parent_id' => 75 
      ) 
    ) 
    '6' => array(
      'Menu' => array(
        'id' => 65 
        'name' => 'Lists' 
        'parent_id' => 75 
      ) 
    ) 
); 

कुछ माता पिता स्रोत सरणी से याद कर रहे हैं। मैं लापता माता-पिता के साथ जड़ होने वाली वस्तुओं को चाहूंगा। परिणाम सरणी:

$result = array(
    '0' => array(
      'Menu' => array(
        'id' => 45 
        'name' => 'Home' 
        'parent_id' => 1 
      ) 
      'Children' => array() 
    ) 
    '1' => array(
      'Menu' => array(
        'id' => 47 
        'name' => 'Get started' 
        'parent_id' => 1 
      ) 
      'Children' => array() 
    ) 
    '2' => array(
      'Menu' => array(
        'id' => 72 
        'name' => 'Attributes' 
        'parent_id' => 71 
      ) 
      'Children' => array() 
    ) 
    '3' => array(
      'Menu' => array(
        'id' => 73 
        'name' => 'Headings' 
        'parent_id' => 71 
      ) 
      'Children' => array() 
    ) 
    '4' => array(
      'Menu' => array(
        'id' => 75 
        'name' => 'Links' 
        'parent_id' => 71 
      ) 
      'Children' => array(
        '0' => array(
         'Menu' => array(
          'id' => 59 
          'name' => 'Images' 
          'parent_id' => 75 
         ) 
         'Children' => array() 
        ) 
        '1' => array(
         'Menu' => array(
          'id' => 65 
          'name' => 'Lists' 
          'parent_id' => 75 
         ) 
         'Children' => array() 
        ) 
      ) 
    ) 
); 

अद्यतन: हटाए गए वर्ग ब्रैकेट।

+1

वह पहला व्यक्ति पहले से ही एक बहुआयामी सरणी है। बहुआयामी बस सरणी के अंदर सरणी का मतलब है। – animuson

+0

क्या आप केक का उपयोग कर रहे हैं? – Young

+0

ओह यह वैध PHP नहीं है .. [0] => सरणी (... या ['मेनू'] => सरणी (... मतलब है? तो मैं आपके इनपुट के आकार को समझ नहीं रहा हूं डेटा –

उत्तर

16

मुझे नहीं लगता कि PHP में एक अंतर्निहित फ़ंक्शन है जो ऐसा करता है।

मैं निम्नलिखित कोड की कोशिश की, और यह नेस्टेड सरणी जिस तरह से आप का वर्णन तैयार करने के लिए काम करने के लिए लगता है:

$nodes = array(); 
$tree = array(); 
foreach ($source as &$node) { 
    $node["Children"] = array(); 
    $id = $node["Menu"]["id"]; 
    $parent_id = $node["Menu"]["parent_id"]; 
    $nodes[$id] =& $node; 
    if (array_key_exists($parent_id, $nodes)) { 
    $nodes[$parent_id]["Children"][] =& $node; 
    } else { 
    $tree[] =& $node; 
    } 
} 

var_dump($tree); 

मैं एक PHP वर्ग मैं अपनी प्रस्तुति Hierarchical Models in SQL and PHP के लिए लिखा था में एक समान एल्गोरिथ्म लिखा था, लेकिन मैं सादे सरणी के बजाय वस्तुओं का उपयोग कर रहा था।

+0

आप शानदार हैं! समाधान समाधान के लिए धन्यवाद और तेजी से जवाब sush! स्रोत सरणी डेटाबेस क्वेरी का परिणाम है। – bancer

+1

ध्यान दें कि यह एल्गोरिदम केवल तभी काम करता है जब माता-पिता अपने बच्चों के सामने आने से पहले डीबी परिणाम सेट में दिखाई देते हैं। –

+0

अच्छा कोड। +1 ले लो – Oyeme

0

मैंने इस संस्करण को रूट पैरेंट_आईडी 0 या गायब होने पर लिखा है। माता-पिता के बाद डीबी ($ स्रोत) में बच्चों के लिए कोई फर्क नहीं पड़ता।

$source_by_id = array(); 
foreach ($source as &$row){ 
    $source_by_id[$row['id']] = &$row; 
} 
foreach ($source_by_id as $id => &$row){ 
    $source_by_id[ intval($row['parent_id']) ]['children'][$id] = &$row; 
} 
// remove cycling itself 
unset($source_by_id[0]['children'][0]); 

$result = $source_by_id[0]['children']; 

परिणाम सरणी कुंजी उपयुक्त आईडी हैं। का आनंद लें!

0

मैं श्रेणियों के साथ ऐसा करने का उदाहरण ढूंढ रहा था। यह उदाहरण मानता है कि माता-पिता के पास हमेशा '0' की मूल आईडी होगी। उदाहरण ZF2 का उपयोग कर रहा है।

कोई संदर्भ या रिकर्सन नहीं। यह चाल आउटपुट में है, आप [0] इंडेक्स की तलाश करते हैं, और बच्चों के लिए, आप index_id को इंडेक्स के रूप में निर्दिष्ट करते हैं।

$categoryLookup = $this->getCategoryLookup($associateById=true); 

if ($assignedCategories) {   
    $categoryHeirarchy = array(); 
    foreach($assignedCategories as $assignedCategory) { 
     $child = $categoryLookup[$assignedCategory->category_id]; 
     $parent = $categoryLookup[$child->parent_id];    
     $categoryHeirarchy[$child->parent_id][] = $categoryLookup[$child->category_id]; 
     $categoryHeirarchy[$parent->parent_id][$parent->category_id] = $categoryLookup[$parent->category_id]; 
    }   

    return $categoryHeirarchy; 
} 


<h3>Categories</h3> 
<dl class="dl-horizontal"> 
    <?php foreach($this->categoryHeirarchy[0] as $parent): ?> 
     <dt><?php echo $this->escapeHtml($parent->name); ?></dt> 
     <?php foreach($this->categoryHeirarchy[$parent->category_id] as $child): ?> 
      <dd><?php echo $this->escapeHtml($child->name); ?></dd> 
     <?php endforeach; ?> 
    <?php endforeach; ?>      
</dl> 
संबंधित मुद्दे