दिलचस्प पोस्ट
मैं स्वयं को हस्ताक्षर किए प्रमाण पत्र कैसे स्वीकार कर सकता हूं? जावास्क्रिप्ट RegEx नहीं कार्य करना MATLAB के MEX कंपाइलर के रूप में जीसीसी (मिनजीडब्ल्यू) का उपयोग करना क्या टेक्स्ट-ओवरफ्लो का उपयोग करना संभव है: बहुलेख पाठ पर एलीपिसिस? जावा में होस्टनाम प्राप्त करने का अनुशंसित तरीका फोरेक का प्रदर्शन, लैम्ब्डा के साथ array_map और स्थिर कार्य के साथ array_map -didSelectRowAtIndexPath: नहीं बुलाया जा रहा है क्या जावा में अंतिम कीवर्ड का उपयोग प्रदर्शन में सुधार करता है? दूसरे के बाद एक को निष्पादित करने के लिए मैं 3 कार्यों को कैसे कॉल करूँ? कैसे कुछ एचटीएमएल टैग के लिए मनमाना डेटा को स्टोर करना है प्रगति डीआईएलओओग एंड्रॉइड दिखाना HTML5 / कैनवास का समर्थन डबल बफ़र करता है? इकाई फ़्रेमवर्क मेटाडेटा से डाटाबेस तालिका नाम प्राप्त करें सी कैसे गणना करता है पाप () और अन्य गणित कार्यों? मैं XPath के साथ सीएसएस वर्ग के द्वारा एक तत्व कैसे प्राप्त करूं?

सरणी सूची से सरणी का पेड़ बनाएं

मेरे पास इस तरह की एक सूची है:

array( array(id=>100, parentid=>0, name=>'a'), array(id=>101, parentid=>100, name=>'a'), array(id=>102, parentid=>101, name=>'a'), array(id=>103, parentid=>101, name=>'a'), ) 

लेकिन जिस तरह से बड़ा है, इसलिए मुझे इसे इस तरह की संरचना की तरह एक पेड़ में बनाने के लिए एक कारगर तरीका चाहिए:

 array( id=>100, parentid=>0, name=>'a', children=>array( id=>101, parentid=>100, name=>'a', children=>array( id=>102, parentid=>101, name=>'a', id=>103, parentid=>101, name=>'a', ) ) ) 

मैं नीडिंत सेट या चीजों जैसी चीज़ों का उपयोग नहीं कर सकता जैसे कि मैं अपने डाटाबेस में बाएं और दायें मान जोड़ सकता हूं। कोई विचार?

वेब के समाधान से एकत्रित समाधान "सरणी सूची से सरणी का पेड़ बनाएं"

oke इस तरह से मैं इसे हल किया है:

 $arr = array( array('id'=>100, 'parentid'=>0, 'name'=>'a'), array('id'=>101, 'parentid'=>100, 'name'=>'a'), array('id'=>102, 'parentid'=>101, 'name'=>'a'), array('id'=>103, 'parentid'=>101, 'name'=>'a'), ); $new = array(); foreach ($arr as $a){ $new[$a['parentid']][] = $a; } $tree = createTree($new, array($arr[0])); print_r($tree); function createTree(&$list, $parent){ $tree = array(); foreach ($parent as $k=>$l){ if(isset($list[$l['id']])){ $l['children'] = createTree($list, $list[$l['id']]); } $tree[] = $l; } return $tree; } 

यदि आपको 1 से अधिक पैरेंटिड [0] तत्व की जरूरत है तो छोटे सुधार करें 🙂

 $arr = array( array('id'=>100, 'parentid'=>0, 'name'=>'a'), array('id'=>101, 'parentid'=>100, 'name'=>'a'), array('id'=>102, 'parentid'=>101, 'name'=>'a'), array('id'=>103, 'parentid'=>101, 'name'=>'a'), ); $new = array(); foreach ($arr as $a){ $new[$a['parentid']][] = $a; } $tree = createTree($new, $new[0]); // changed print_r($tree); function createTree(&$list, $parent){ $tree = array(); foreach ($parent as $k=>$l){ if(isset($list[$l['id']])){ $l['children'] = createTree($list, $list[$l['id']]); } $tree[] = $l; } return $tree; } 

थंडरस्ट्रियार के संस्करण का एक और पुनः प्रयोग – एक समारोह में सभी तर्क:

 function buildTree($flat, $pidKey, $idKey = null) { $grouped = array(); foreach ($flat as $sub){ $grouped[$sub[$pidKey]][] = $sub; } $fnBuilder = function($siblings) use (&$fnBuilder, $grouped, $idKey) { foreach ($siblings as $k => $sibling) { $id = $sibling[$idKey]; if(isset($grouped[$id])) { $sibling['children'] = $fnBuilder($grouped[$id]); } $siblings[$k] = $sibling; } return $siblings; }; $tree = $fnBuilder($grouped[0]); return $tree; } // Example: $flat = [ ['id'=>100, 'parentID'=>0, 'name'=>'a'], ['id'=>101, 'parentID'=>100, 'name'=>'a'], ['id'=>102, 'parentID'=>101, 'name'=>'a'], ['id'=>103, 'parentID'=>101, 'name'=>'a'], ]; $tree = buildTree($flat, 'parentID', 'id'); print_r($tree); 

खेल का मैदान: https://www.tehplayground.com/5V8QSqnmFJ2wcIoj

यहां आर्थर के पुनर्व्यवस्था से मेरा अनुकूलन है:

 /* Recursive branch extrusion */ function createBranch(&$parents, $children) { $tree = array(); foreach ($children as $child) { if (isset($parents[$child['id']])) { $child['children'] = $this->createBranch($parents, $parents[$child['id']]); } $tree[] = $child; } return $tree; } /* Initialization */ function createTree($flat, $root = 0) { $parents = array(); foreach ($flat as $a) { $parents[$a['parent']][] = $a; } return $this->createBranch($parents, $parents[$root]); } 

उपयोग:

 $tree = createTree($flat); 

मैंने एक असामान्य (पुनरावर्ती के बजाय 'आधारित-आधारित') बनाया है, लेकिन बहुआयामी सॉर्टिंग फ़ंक्शन जो सरणी से चलते हैं, जब तक कि कोई अनाथ नहीं हो। यहां फ़ंक्शन:

 function treeze( &$a, $parent_key, $children_key ) { $orphans = true; $i; while( $orphans ) { $orphans = false; foreach( $a as $k=>$v ) { // is there $a[$k] sons? $sons = false; foreach( $a as $x=>$y ) if( isset($y[$parent_key]) and $y[$parent_key]!=false and $y[$parent_key]==$k ) { $sons=true; $orphans=true; break; } // $a[$k] is a son, without children, so i can move it if( !$sons and isset($v[$parent_key]) and $v[$parent_key]!=false ) { $a[$v[$parent_key]][$children_key][$k] = $v; unset( $a[$k] ); } } } } 

सिफारिश: सरणी के प्रत्येक तत्व की कुंजी को तत्व के लिए आईडी होना चाहिए। उदाहरण:

 $ARRAY = array( 1 => array( 'label' => "A" ), 2 => array( 'label' => "B" ), 3 => array( 'label' => "C" ), 4 => array( 'label' => "D" ), 5 => array( 'label' => "one", 'father' => '1' ), 6 => array( 'label' => "two", 'father' => '1' ), 7 => array( 'label' => "three", 'father' => '1' ), 8 => array( 'label' => "node 1", 'father' => '2' ), 9 => array( 'label' => "node 2", 'father' => '2' ), 10 => array( 'label' => "node 3", 'father' => '2' ), 11 => array( 'label' => "I", 'father' => '9' ), 12 => array( 'label' => "II", 'father' => '9' ), 13 => array( 'label' => "III", 'father' => '9' ), 14 => array( 'label' => "IV", 'father' => '9' ), 15 => array( 'label' => "V", 'father' => '9' ), ); 

उपयोग: फ़ंक्शन को $ a (सरणी), $ parent_key (कॉलम का नाम जहां पिता का आईडी बचाया गया है) की आवश्यकता है, $ children_key (कॉलम का नाम जहां बच्चों को स्थानांतरित किया जाएगा) यह कुछ भी रिटर्न नहीं देता (सरणी को संदर्भ के द्वारा बदल दिया गया है) उदाहरण:

 treeze( $ARRAY, 'father', 'children' ); echo "<pre>"; print_r( $ARRAY ); 

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

मैं आपके लिए सभी काम नहीं करूंगा, लेकिन फ़ंक्शन के पैरामीटर कुछ ऐसा दिखेगा:

फ़ंक्शन रिकर्सिव बच्चों ($ items_array, $ parent_id = 0)

मूल रूप से, यह सभी को 0 के अभिभावक के साथ मिल जाएगा, फिर उनमें से प्रत्येक के लिए यह उन सभी लोगों को उस आईडी के साथ माता-पिता के रूप में मिल जाएगा, और उनमें से प्रत्येक के लिए .. इतने पर।

अंतिम परिणाम होना चाहिए जिसे आप ढूंढ रहे हैं।

 //if order by parentid, id $arr = array( array('id'=>100, 'parentid'=>0, 'name'=>'a'), array('id'=>101, 'parentid'=>100, 'name'=>'a'), array('id'=>102, 'parentid'=>101, 'name'=>'a'), array('id'=>103, 'parentid'=>101, 'name'=>'a'), ); $arr_tree = array(); $arr_tmp = array(); foreach ($arr as $item) { $parentid = $item['parentid']; $id = $item['id']; if ($parentid == 0) { $arr_tree[$id] = $item; $arr_tmp[$id] = &$arr_tree[$id]; } else { if (!empty($arr_tmp[$parentid])) { $arr_tmp[$parentid]['children'][$id] = $item; $arr_tmp[$id] = &$arr_tmp[$parentid]['children'][$id]; } } } unset($arr_tmp); echo '<pre>'; print_r($arr_tree); echo "</pre>"; 

क्या कोई ऐसा कारण है कि यह तीन पास पद्धति काम नहीं करेगी? मैंने कुछ पुनरावर्ती समाधानों की गति की तुलना करने के लिए कोई भी परीक्षण नहीं किया, लेकिन यह आगे अधिक सादे लग रहा था। यदि आपकी प्रारंभिक सरणी ID के साथ पहले से संबद्ध है, तो आप पहली बार foreach को छोड़ सकते हैं ()।

 function array_tree(&$array) { $tree = array(); // Create an associative array with each key being the ID of the item foreach($array as $k => &$v) $tree[$v['id']] = &$v; // Loop over the array and add each child to their parent foreach($tree as $k => &$v) { if(!$v['parent']) continue; $tree[$v['parent']]['children'][] = &$v; } // Loop over the array again and remove any items that don't have a parent of 0; foreach($tree as $k => &$v) { if(!$v['parent']) continue; unset($tree[$k]); } return $tree; }