दिलचस्प पोस्ट
एक <a> लिंक के 'href' मूल्य को खोजने के लिए नियमित अभिव्यक्ति UINavigationController प्रोग्रामिंग में UINavigationBar का कस्टम उप-वर्ग सेट करें मेरे आने वाले Django अनुरोध में मेरा JSON डेटा कहां है? स्टार्टअप के बाद MVC6 का मार्ग संग्रह बदलें शून्य का आकार क्या है? क्या कारण है और NoClassDefFoundError और ClassNotFoundException के बीच अंतर क्या हैं? जावा के जरिए सीएमडी कमांड चलाएं एंड्रॉइड ऐप मेमोरी के मुद्दों से बाहर – सब कुछ करने की कोशिश की और फिर भी नुकसान पर एकल डीजेंगो मॉडलफ़ॉर्म में कई मॉडल? मैटलैब में एक भूखंड के डेटा को कैसे अपडेट करूँ? हटाए जाने के बाद SQL सर्वर में ऑटोइंचर रीसेट करें ClassNotFoundException: क्लास "com.google.android.gms.ads.AdView" नहीं मिला स्विफ्ट स्थिरांक: स्ट्रैक्ट या एन्यूम PHPMailer के साथ त्रुटि हैंडलिंग दिनांक स्ट्रिंग से समय निकालें

PHP रिलेशनल डेटा के साथ एक सरणी से एक बहुआयामी सरणी बनाएं

संभव डुप्लिकेट:
माता-पिता ID मानों के आधार पर एक से बहु-आयामी के लिए एक सरणी परिवर्तित करना

मैं PHP में काम कर रहा हूँ

मेरे पास निम्न सरणी है जिसमें रिलेशनल डेटा (अभिभावक बच्चे रिश्तों) हैं I

Array ( [5273] => Array ( [id] => 5273 [name] => John Doe [parent] => ) [6032] => Array ( [id] => 6032 [name] => Sally Smith [parent] => 5273 ) [6034] => Array ( [id] => 6034 [name] => Mike Jones [parent] => 6032 ) [6035] => Array ( [id] => 6035 [name] => Jason Williams [parent] => 6034 ) [6036] => Array ( [id] => 6036 [name] => Sara Johnson [parent] => 5273 ) [6037] => Array ( [id] => 6037 [name] => Dave Wilson [parent] => 5273 ) [6038] => Array ( [id] => 6038 [name] => Amy Martin [parent] => 6037 ) ) 

मुझे इस JSON प्रारूप में होना चाहिए:

 { "id":"5273", "name":"John Doe", "data":{ }, "children":[ { "id":" Sally Smith", "name":"6032", "data":{ }, "children":[ { "id":"6034", "name":"Mike Jones", "data":{ }, "children":[ { "id":"6035", "name":"Jason Williams", "data":{ }, "children":[ { "id":"node46", "name":"4.6", "data":{ }, "children":[ ] } ] } ] }, { "id":"6036", "name":"Sara Johnson", "data":{ }, "children":[ ] }, { "id":"6037", "name":"Dave Wilson", "data":{ }, "children":[ { "id":"6038", "name":"Amy Martin", "data":{ }, "children":[ ] } ] } ] } ] } 

मुझे पता है कि मुझे एक बहुआयामी सरणी बनाने और इसे json_encode () के माध्यम से चलाने की आवश्यकता है मुझे यह भी मानना ​​है कि इस पद्धति का उपयोग इस पुनरावर्ती होने के लिए किया जाता है क्योंकि वास्तविक दुनिया के आंकड़ों में अज्ञात संख्याएं हो सकती हैं

मुझे अपने कुछ दृष्टिकोणों को दिखाने में खुशी होगी, लेकिन उन्होंने काम नहीं किया है।

क्या कोई मेरी मदद कर सकता है?

मुझे अपना काम साझा करने के लिए कहा गया था यही मैंने कोशिश कर ली है, लेकिन मुझे नहीं मिला है कि मुझे नहीं पता कि यह कितना उपयोगी है।

मैंने सिर्फ रिश्तों की एक सरणी बनाई है

 foreach($array as $k => $v){ $relationships[$v['id']] = $v['parent']; } 

मुझे लगता है कि (एक अन्य SO पोस्ट पर आधारित) इस रिलेशनल डेटा को नए बहुआयामी सरणी बनाने के लिए इस्तेमाल किया। यदि मुझे यह काम करने के लिए मिला है तो मैं सही "बच्चों" लेबल आदि में जोड़ने पर काम करने जा रहा था।

 $childrenTable = array(); $data = array(); foreach ($relationships as $n => $p) { //parent was not seen before, put on root if (!array_key_exists($p, $childrenTable)) { $childrenTable[$p] = array(); $data[$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, $data)) { unset($data[$n]); } $childrenTable[$p][$n] = &$childrenTable[$n]; } unset($childrenTable); print_r($data); 

वेब के समाधान से एकत्रित समाधान "PHP रिलेशनल डेटा के साथ एक सरणी से एक बहुआयामी सरणी बनाएं"

 <?php header('Content-Type: application/json; charset="utf-8"'); /** * Helper function * * @param array $d flat data, implementing a id/parent id (adjacency list) structure * @param mixed $r root id, node to return * @param string $pk parent id index * @param string $k id index * @param string $c children index * @return array */ function makeRecursive($d, $r = 0, $pk = 'parent', $k = 'id', $c = 'children') { $m = array(); foreach ($d as $e) { isset($m[$e[$pk]]) ?: $m[$e[$pk]] = array(); isset($m[$e[$k]]) ?: $m[$e[$k]] = array(); $m[$e[$pk]][] = array_merge($e, array($c => &$m[$e[$k]])); } return $m[$r][0]; // remove [0] if there could be more than one root nodes } echo json_encode(makeRecursive(array( array('id' => 5273, 'parent' => 0, 'name' => 'John Doe'), array('id' => 6032, 'parent' => 5273, 'name' => 'Sally Smith'), array('id' => 6034, 'parent' => 6032, 'name' => 'Mike Jones'), array('id' => 6035, 'parent' => 6034, 'name' => 'Jason Williams'), array('id' => 6036, 'parent' => 5273, 'name' => 'Sara Johnson'), array('id' => 6037, 'parent' => 5273, 'name' => 'Dave Wilson'), array('id' => 6038, 'parent' => 6037, 'name' => 'Amy Martin'), ))); 

डेमो: https://3v4l.org/s2PNC

ठीक है, यह कैसे काम करता है, आप वास्तव में बहुत दूर नहीं थे जितना आपने शुरू किया था, लेकिन वास्तव में आप क्या देख रहे हैं संदर्भ हैं यह एक सामान्य प्रक्रिया है:

चूंकि उनके आईडी पर माता-पिता और बाल-नोड्स के बीच संबंध है, आपको सबसे पहले आईडी पर आधारित आंकड़ों को सूचकित करना होगा। यदि आप डेटाबेस से पढ़ते हैं, तो मैं आपके डेटा एक्सेस को अनुकरण करने के लिए एक सरणी ( $rows ) के साथ ऐसा करता हूं, यह समान होगा। इस अनुक्रमण के साथ आप अतिरिक्त गुण जैसे अतिरिक्त गुण जोड़ सकते हैं:

 // create an index on id $index = array(); foreach($rows as $row) { $row['data'] = (object) array(); $index[$row['id']] = $row; } 

तो अब सभी प्रविष्टियां उनके आईडी पर अनुक्रमित हैं यह पहला कदम था।

दूसरा कदम समान रूप से सीधे आगे है। क्योंकि अब हम $index में आईडी के आधार पर प्रत्येक नोड तक पहुंच सकते हैं, हम बच्चों को अपने माता-पिता के लिए आवंटित कर सकते हैं।

एक "आभासी" नोड है, जो आईडी 0 के साथ है। हालांकि, यह किसी पंक्ति में मौजूद नहीं है, हालांकि, अगर हम बच्चों को भी इसमें जोड़ सकते हैं, तो हम इस मूल संग्रह के लिए स्टोर के रूप में इस बच्चों के संग्रह का उपयोग कर सकते हैं। नोड्स, आपके मामले में, एक रूट रूट नोड है

ज़रूर, आईडी 0 , हमें माता-पिता की प्रक्रिया नहीं करनी चाहिए – क्योंकि यह मौजूद नहीं है।

तो हम ऐसा करते हैं हम संदर्भों का उपयोग यहां करते हैं क्योंकि अन्यथा एक ही नोड माता-पिता और बच्चे दोनों नहीं हो सकते हैं:

 // build the tree foreach($index as $id => &$row) { if ($id === 0) continue; $parent = $row['parent']; $index[$parent]['children'][] = &$row; } unset($row); 

क्योंकि हम संदर्भों का उपयोग करते हैं, आखिरी $row में लूप के बाद $row में संग्रहीत संदर्भ को सेट करने के लिए परवाह है।

अब सभी बच्चों को अपने माता-पिता को सौंप दिया गया है। यह पहले से ही हो सकता है, हालांकि अंतिम चरण को नहीं भूलना चाहिए, आउटपुट के लिए वास्तविक नोड तक पहुंचना चाहिए।

संक्षेप के लिए, बस रूट $index ही दें। अगर हमें याद है, हम चाहते हैं कि केवल रूट नोड आईडी 0 साथ नोड में बच्चों के सरणी में पहला है:

 // obtain root node $index = $index[0]['children'][0]; 

और बस। हम जेएसएएन उत्पन्न करने के लिए अभी इसका उपयोग कर सकते हैं:

 // output json header('Content-Type: application/json'); echo json_encode($index); 

अंत में एक नज़र में पूरे कोड:

 <?php /** * @link http://stackoverflow.com/questions/11239652/php-create-a-multidimensional-array-from-an-array-with-relational-data */ $rows = array( array('id' => 5273, 'parent' => 0, 'name' => 'John Doe'), array('id' => 6032, 'parent' => 5273, 'name' => 'Sally Smith'), array('id' => 6034, 'parent' => 6032, 'name' => 'Mike Jones'), array('id' => 6035, 'parent' => 6034, 'name' => 'Jason Williams'), array('id' => 6036, 'parent' => 5273, 'name' => 'Sara Johnson'), array('id' => 6037, 'parent' => 5273, 'name' => 'Dave Wilson'), array('id' => 6038, 'parent' => 6037, 'name' => 'Amy Martin'), ); // create an index on id $index = array(); foreach($rows as $row) { $row['data'] = (object) []; $index[$row['id']] = $row; } // build the tree foreach($index as $id => &$row) { if ($id === 0) continue; $parent = $row['parent']; $index[$parent]['children'][] = &$row; } unset($row); // obtain root node $index = $index[0]['children'][0]; // output json header('Content-Type: application/json'); echo json_encode($index, JSON_PRETTY_PRINT); 

कौन सा निम्नलिखित JSON (PHP 5.4 एस ' JSON_PRETTY_PRINT ):

 { "id": 5273, "parent": 0, "name": "John Doe", "data": { }, "children": [ { "id": 6032, "parent": 5273, "name": "Sally Smith", "data": { }, "children": [ { "id": 6034, "parent": 6032, "name": "Mike Jones", "data": { }, "children": [ { "id": 6035, "parent": 6034, "name": "Jason Williams", "data": { } } ] } ] }, { "id": 6036, "parent": 5273, "name": "Sara Johnson", "data": { } }, { "id": 6037, "parent": 5273, "name": "Dave Wilson", "data": { }, "children": [ { "id": 6038, "parent": 6037, "name": "Amy Martin", "data": { } } ] } ] } 

निम्नलिखित कोड का काम होगा .. आप अपनी ज़रूरतों के अनुसार थोड़ा सा बदलाव कर सकते हैं।

 $data = array( '5273' => array( 'id' =>5273, 'name'=> 'John Doe', 'parent'=>''), '6032' => array( 'id' =>6032, 'name'=> 'Sally Smith', 'parent'=>'5273'), '6034' => array( 'id' =>6034, 'name'=> 'Mike Jones ', 'parent'=>'6032'), '6035' => array( 'id' =>6035, 'name'=> 'Jason Williams', 'parent'=>'6034') ); $fdata = array(); function ConvertToMulti($data) { global $fdata; foreach($data as $k => $v) { if(empty($v['parent'])){ unset($v['parent']); $v['data'] = array(); $v['children'] = array(); $fdata[] = $v; } else { findParentAndInsert($v, $fdata); } } } function findParentAndInsert($idata, &$ldata) { foreach ($ldata as $k=>$v) { if($ldata[$k]['id'] == $idata['parent']) { unset($idata['parent']); $idata['data'] = array(); $idata['children'] = array(); $ldata[$k]['children'][] = $idata; return; } else if(!empty($v['children'])) findParentAndInsert($idata, $ldata[$k]['children']); } } print_r($data); ConvertToMulti($data); echo "AFTER\n"; print_r($fdata); 

http://codepad.viper-7.com/Q5Buaz