संपादित करें:
मैंने पहले आपके द्वारा दिए गए आउटपुट से एक बहु-आयामी सरणी बनाने के लिए एक समाधान पोस्ट किया था और साथ ही एक विशेष id
के सभी चाइल्ड तत्वों को प्राप्त करने का एक तरीका भी पोस्ट किया था। उस विशेष सरणी से। मुझे अब पता चला है कि सीधे आपके आउटपुट से बाल तत्वों को कैसे पुनर्प्राप्त किया जाए (बिना पहले buildtree()
समारोह:
function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array())
{
foreach($src_arr as $row)
{
if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid)
{
$rowdata = array();
foreach($row as $k => $v)
$rowdata[$k] = $v;
$cats[] = $rowdata;
if($row['parent_id'] == $currentid)
$cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true));
}
}
return $cats;
}
उपरोक्त फ़ंक्शन का उपयोग करने के लिए, बस आउटपुट सरणी $data
. में पास करें पहले तर्क और id
. के लिए आप दूसरे तर्क से बाल तत्वों को पुनः प्राप्त करना चाहते हैं:
उदा.:
$list = fetch_recursive($data, 3);
जो आपको id
. के लिए सही सरणी संरचना प्रदान करे 3
(जैसा कि इस उत्तर के अंतिम कोडबॉक्स में उदाहरण में देखा गया है)।
मूल उत्तर:
मैं अब तक इस डिजाइन से नेस्टेड पेड़ बनाने के लिए एक पुनरावर्ती कार्य लिखने के लिए कभी नहीं मिला था। मुझे यकीन है कि ऐसे बहुत से लोग हैं जिन्होंने समान कार्य लिखे हैं, लेकिन यह निश्चित रूप से आपके लिए काम करना चाहिए:
function buildtree($src_arr, $parent_id = 0, $tree = array())
{
foreach($src_arr as $idx => $row)
{
if($row['parent_id'] == $parent_id)
{
foreach($row as $k => $v)
$tree[$row['id']][$k] = $v;
unset($src_arr[$idx]);
$tree[$row['id']]['children'] = buildtree($src_arr, $row['id']);
}
}
ksort($tree);
return $tree;
}
यह फ़ंक्शन पुनरावर्ती रूप से एक आसन्न सूची से एक पेड़ का निर्माण करेगा और आईडी के क्रम को आरोही क्रम में रखेगा। यह id
. भी बनाता है प्रत्येक माता-पिता/बच्चे की जानकारी के प्रत्येक सरणी की कुंजी।
यह कोड:
$r = mysql_query("SELECT * FROM test ");
$data = array();
while($row = mysql_fetch_assoc($r)) {
$data[] = $row;
}
echo '<pre>';
print_r(buildtree($data));
echo '</pre>';
'; कुछ इस तरह आउटपुट करेगा:
Array
(
[1] => Array
(
[id] => 1
[name] => Electronics
[parent_id] => 0
[children] => Array
(
[2] => Array
(
[id] => 2
[name] => Televisions
[parent_id] => 1
[children] => Array
(
[4] => Array
(
[id] => 4
[name] => Tube
[parent_id] => 2
[children] => Array()
)
[5] => Array
(
[id] => 5
[name] => LCD
[parent_id] => 2
[children] => Array()
)
[6] => Array
(
[id] => 6
[name] => Plasma
[parent_id] => 2
[children] => Array()
)
)
)
[3] => Array
(
[id] => 3
[name] => Portable Electronics
[parent_id] => 1
[children] => Array
(
[7] => Array
(
[id] => 7
[name] => Mp3 Players
[parent_id] => 3
[children] => Array
(
[10] => Array
(
[id] => 10
[name] => Flash
[parent_id] => 7
[children] => Array()
)
)
)
[8] => Array
(
[id] => 8
[name] => CD Players
[parent_id] => 3
[children] => Array()
)
[9] => Array
(
[id] => 9
[name] => 2 Way Radios
[parent_id] => 3
[children] => Array()
)
)
)
)
)
)
किसी विशेष id
. के सभी चाइल्ड-नोड्स प्राप्त करने के लिए एक आयामी सरणी पर, आप इस फ़ंक्शन का उपयोग कर सकते हैं:
function fetch_recursive($tree, $parent_id, $parentfound = false, $list = array())
{
foreach($tree as $k => $v)
{
if($parentfound || $k == $parent_id)
{
$rowdata = array();
foreach($v as $field => $value)
if($field != 'children')
$rowdata[$field] = $value;
$list[] = $rowdata;
if($v['children'])
$list = array_merge($list, fetch_recursive($v['children'], $parent_id, true));
}
elseif($v['children'])
$list = array_merge($list, fetch_recursive($v['children'], $parent_id));
}
return $list;
}
buildtree()
. के आधार पर ऊपर दिए गए फ़ंक्शन, मान लें कि हम id
. के सभी चाइल्ड नोड्स प्राप्त करना चाहते हैं 3:
echo '<pre>';
print_r(fetch_recursive(buildtree($a), 3));
echo '</pre>';
'; यह आउटपुट करेगा:
Array
(
[0] => Array
(
[id] => 3
[name] => Portable Electronics
[parent_id] => 1
)
[1] => Array
(
[id] => 7
[name] => Mp3 Players
[parent_id] => 3
)
[2] => Array
(
[id] => 10
[name] => Flash
[parent_id] => 7
)
[3] => Array
(
[id] => 8
[name] => CD Players
[parent_id] => 3
)
[4] => Array
(
[id] => 9
[name] => 2 Way Radios
[parent_id] => 3
)
)