亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php數組轉換成樹的幾個例子

2024-09-04 11:46:14
字體:
來源:轉載
供稿:網友

下面我整理了一些常用的數組轉換成樹的實例與大家一起學習,我想大家都會很喜歡這篇文章的.Php代碼如下:

  1. $sourceArr 原來的數組  
  2. $key 主鍵  
  3. $parentKey 與主鍵關聯的父主鍵  
  4. $childrenKey 生成的孩子的鍵名  
  5. *  
  6. */   
  7.    
  8. function arrayToTree($sourceArr$key$parentKey$childrenKey)   
  9. {   
  10.     $tempSrcArr = array();   
  11.     foreach ($sourceArr as  $v)   
  12.     {   
  13.         $tempSrcArr[$v[$key]] = $v;   
  14.     }   
  15.     $i = 0;   
  16.     $count = count($sourceArr);   
  17.     for($i = ($count - 1); $i >=0; $i--)   
  18.     {   
  19.         if (isset($tempSrcArr[$sourceArr[$i][$parentKey]]))   
  20.         {   
  21.            $tArr = array_pop($tempSrcArr);   
  22.            $tempSrcArr[$tArr[$parentKey]][$childrenKey] = (isset($tempSrcArr[$tArr[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$tArr[$parentKey]][$childrenKey])) ? $tempSrcArr[$tArr[$parentKey]][$childrenKey] : array();   
  23.            array_push ($tempSrcArr[$tArr[$parentKey]][$childrenKey], $tArr);   
  24.         }   
  25.     }   
  26.     return $tempSrcArr;   
  27. }   

PHP代碼如下:

  1.  * 將數組轉換成樹  
  2.  * 例子:將 array(  
  3.             array('id'=>1,'parentId' => 0,'name'=> 'name1')  
  4.             ,array('id'=>2,'parentId' => 0,'name'=> 'name2')  
  5.             ,array('id'=>4,'parentId' => 1,'name'=> 'name1_4')  
  6.             ,array('id'=>15,'parentId' => 1,'name'=> 'name1_5')  
  7.     ); 
  8.  
  9. /*轉換成  
  10.  * Array(  
  11.     [1] => Array([id] => 1  
  12.             [parentId] => 0  
  13.             [name] => name1  
  14.             [children] => Array(  
  15.                     [0] => Array([id] => 15,[parentId] => 1,[name] => name1_5)  
  16.                     [1] => Array([id] => 4,[parentId] => 1,[name] => name1_4) 
  17.                 )  
  18.         )  
  19.     [2] => Array([id] => 2,[parentId] => 0,[name] => name2)  
  20.  
  21. */ 

* @param array $sourceArr 要轉換的數組 

* @param string $key 數組中確認父子的key,例子中為“id” 

* @param string $parentKey 數組中父key,例子中為“parentId” 

* @param type $childrenKey 要在樹節點上索引子節點的key,例子中為“children” 

* @return array 返回生成的樹 

PHP代碼如下:

  1. function arrayToTree($sourceArr$key$parentKey$childrenKey)   
  2. {   
  3.     $tempSrcArr = array();   
  4.    
  5.     $allRoot = TRUE;   
  6.     foreach ($sourceArr as  $v)   
  7.     {   
  8.         $isLeaf = TRUE;   
  9.         foreach ($sourceArr as $cv )   
  10.         {   
  11.             if (($v[$key]) != $cv[$key])   
  12.             {   
  13.                 if ($v[$key] == $cv[$parentKey])   
  14.                 {   
  15.                     $isLeaf = FALSE;   
  16.                 }   
  17.                 if ($v[$parentKey] == $cv[$key])   
  18.                 {   
  19.                     $allRoot = FALSE;   
  20.                 }   
  21.             }   
  22.         }   
  23.         if ($isLeaf)   
  24.         {   
  25.             $leafArr[$v[$key]] = $v;   
  26.         }   
  27.         $tempSrcArr[$v[$key]] = $v;   
  28.     }   
  29.     if ($allRoot)   
  30.     {   
  31.         return $tempSrcArr;   
  32.     }   
  33.     else   
  34.     {   
  35.         unset($v$cv$sourceArr$isLeaf);   
  36.         foreach ($leafArr as  $v)   
  37.         {   
  38.             if (isset($tempSrcArr[$v[$parentKey]]))   
  39.             {   
  40.                 $tempSrcArr[$v[$parentKey]][$childrenKey] = (isset($tempSrcArr[$v[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$v[$parentKey]][$childrenKey])) ? $tempSrcArr[$v[$parentKey]][$childrenKey] : array();   
  41.                 array_push ($tempSrcArr[$v[$parentKey]][$childrenKey], $v);  
  42.                 unset($tempSrcArr[$v[$key]]);   
  43.             }   
  44.         }   
  45.         unset($v);   
  46.         return arrayToTree($tempSrcArr$key$parentKey$childrenKey);   
  47.     }   

PHP代碼,遞歸方法:

  1. $rows = array(   
  2.     0 => array('id' => 1, 'name' => '菜單1''parentId' => 0)   
  3.     , 1 => array('id' => 2, 'name' => '菜單2''parentId' => 0)   
  4.     , 2 => array('id' => 3, 'name' => '菜單3''parentId' => 0)   
  5.     , 3 => array('id' => 4, 'name' => '菜單1_1''parentId' => 1)   
  6.     , 4 => array('id' => 5, 'name' => '菜單1_2''parentId' => 1)   
  7.     , 5 => array('id' => 6, 'name' => '菜單2_1''parentId' => 2)   
  8. );   
  9. print_r(getTree($rows, 0, 'id''parentId'));  

代碼如下:

  1. /**  
  2.  * 數組根據父id生成樹  
  3.  * @staticvar int $depth 遞歸深度  
  4.  * @param array $data 數組數據  
  5.  * @param integer $pid 父id的值  
  6.  * @param string $key id在$data數組中的鍵值  
  7.  * @param string $chrildKey 要生成的子的鍵值  
  8.  * @param string $pKey 父id在$data數組中的鍵值  
  9.  * @param int $maxDepth 最大遞歸深度,防止無限遞歸  
  10.  * @return array 重組后的數組  
  11.  */   
  12. function getTree($data$pid = 0, $key = 'id'$pKey = 'parentId'$childKey = 'child'$maxDepth = 0){   
  13.     static $depth = 0;   
  14.     $depth++;   
  15.     if (intval($maxDepth) <= 0)   
  16.     {   
  17.         $maxDepth = count($data) * count($data);   
  18.     }   
  19.     if ($depth > $maxDepth)   
  20.     {   
  21.         exit("error recursion:max recursion depth {$maxDepth}");   
  22.     }   
  23.     $tree = array();   
  24.     foreach ($data as $rk => $rv)   
  25.     {   
  26.         if ($rv[$pKey] == $pid)   
  27.         {   
  28.             $rv[$childKey] = getTree($data$rv[$key], $key$pKey$childKey$maxDepth);   
  29.             $tree[] = $rv;   
  30.         }   
  31.     }   
  32.     return $tree;   
  33. }  

一個實例,代碼如下:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  5. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
  6. <title>TREE</title> 
  7. <style type="text/css"
  8. /*樹的全局CSS*/ 
  9. .kyp_tree{ 
  10. font: 12px/2.5 verdana; 
  11. float:left;display:inline; 
  12. .kyp_tree dd{ 
  13. margin:0;padding:0; 
  14. margin-left:20px; 
  15. /*鏈接*/ 
  16. .kyp_tree dl a{ 
  17. font-size:12px; 
  18. color:#333; 
  19. text-decoration:none; 
  20. .kyp_tree dl a:hover, .kyp_tree dd dt.red_sub a{ 
  21. font-size:12px; 
  22. color:#AE0002; 
  23. /*一級dl*/ 
  24. .kyp_tree dl{ 
  25. border-bottom:1px dashed #ccc; 
  26. margin:0;padding:0; 
  27. /*次級dl*/ 
  28. .kyp_tree dl dl, .kyp_tree dl.last{ 
  29. border:none; 
  30. .kyp_tree dd dt.currentClass{ 
  31. background:url(tree_top.gif) no-repeat 0 -24px;  
  32. /*一級標題*/ 
  33. .kyp_tree dt{ 
  34. background:url(tree_top.gif) no-repeat 2px -57px; 
  35. padding-left:15px; 
  36. cursor:pointer; 
  37. font-size:13px; 
  38. height:30px; 
  39. line-height :27px; 
  40. line-height :32px9; 
  41. /*子標題*/ 
  42. .kyp_tree dd dt{ 
  43. background:url(tree_arrow.gif) no-repeat 2px 10px; 
  44. font-size:12px; 
  45. /*一級張開樣式*/ 
  46. .kyp_tree dt.open{ 
  47. background:url(tree_top.gif) no-repeat 2px 12px;  
  48. /*張開樣式*/ 
  49. .kyp_tree dd dt.open{ 
  50. background:url(tree_arrow.gif) no-repeat 0 -25px;  
  51. /*沒有子節點的樣式*/ 
  52. .kyp_tree dt.nosub{ 
  53. background:none; 
  54. </style> 
  55. <script type="text/javascript"
  56. //<![CDATA[ 
  57. jQuery.fn.createTree = function (fn, ini){ 
  58. var $ = jQuery, ini = Object(ini); 
  59. this.find('dd').hide(); 
  60. this.children('dl:last').addClass('last'); 
  61. this.find('dt', this).each(function (){ 
  62. var nosub = $(this).next('dd').size() == 0; 
  63. if (nosub) { 
  64. $(this).addClass('nosub'); 
  65. if (ini.id && ini.id == $(this).attr('classify')) { 
  66. $(this).parents('dd').show().prev('dt').addClass('open'); 
  67. $(this).addClass('red_sub'); 
  68. if (nosub) { 
  69. $(this).addClass('currentClass'
  70. }else
  71. $(this).next('dd').show(); 
  72. $(this).addClass('open'
  73. }).click(function (e){ 
  74. var dd = $(this).next('dd'), 
  75. isClose = dd.css('display') == 'none'
  76. if (dd.size()) { 
  77. if (isClose) { 
  78. dd.show(); 
  79. $(this).addClass('open'
  80. }else
  81. dd.hide(); 
  82. $(this).removeClass('open'
  83. }  
  84. return fn && fn.call(this, e, dd) 
  85. }); 
  86. if (ini.mx) { 
  87. this.find('dt').click(function (e){ 
  88. var J = $(this); 
  89. if (J.next('dd').size()) { 
  90. if (J.hasClass('open')) { 
  91. J.parent().siblings('dl').children('dd').hide(); 
  92. J.parent().siblings('dl').children('dt').removeClass('open'); 
  93. J.next('dd').show(); 
  94. J.addClass('open')  
  95. }  
  96. })  
  97. }; 
  98. (function ($){ 
  99. $(function (){ 
  100. $('#tree_wrap').createTree(function (e, dd){//回調(事件, 下一個dd) 
  101. $('#show').html(this.innerHTML+dd.size()) 
  102. }, {mx: 1, id: 200})// mx是否互斥, id 當前類別 
  103. }); 
  104. })(jQuery) 
  105. //]]> 
  106. </script> 
  107. </head> 
  108. <body> 
  109. <?php 
  110. // 樹組的順序即是分類的順序,因此前當分類的下級子類一定要緊隨其后 
  111. $treearray
  112. 1 => array('id'=>1, 'cname'=>'一級分類''pid'=>0), 
  113. 100 => array('id'=>100, 'cname'=>'特意加進去的二級分類''pid'=>1), 
  114. 101 => array('id'=>101, 'cname'=>'特意加進去的二級分類2222222222''pid'=>1), 
  115. 2 => array('id'=>2, 'cname'=>'二級分類''pid'=>1), 
  116. 3 => array('id'=>3, 'cname'=>'三級分類''pid'=>2), 
  117. 4 => array('id'=>4, 'cname'=>'四級分類''pid'=>3), 
  118. 5 => array('id'=>5, 'cname'=>'四級分類2''pid'=>3), 
  119. 200 => array('id'=>200, 'cname'=>'55555''pid'=>5), 
  120. 6 => array('id'=>6, 'cname'=>'另一級分類''pid'=>0), 
  121. 7 => array('id'=>7, 'cname'=>'First First First''pid'=>0), 
  122. 8 => array('id'=>8, 'cname'=>'First First First''pid'=>7), 
  123. ); 
  124. // 指定分類ID,返回子類量(不進行深度遞歸) 
  125. function getChildTotal($id
  126. global $tree
  127. $total = 0; 
  128. foreach($tree as $value
  129. if ($id == $value['pid']) 
  130. $total++;  
  131. return $total
  132.  
  133. // 指定分類ID,并返回數組(不進行深度遞歸) 
  134. function getChildArray($id
  135. global $tree
  136. $array = array(); 
  137. foreach($tree as $key=>$value
  138. if ($id == $value['pid']) 
  139. $array[$key] = $value
  140. return $array
  141.  
  142. // 遞歸查詢方式將樹數組轉換成HTML嵌套樹 
  143. function getTreeHTML($tree,$level = 0) 
  144. if ($tree
  145. $level += 1; 
  146. foreach($tree as $id => $node
  147. $html .= "<dl>"
  148. $html .= '<dt classify="'.$node['id'].'"><a href="http://www.baidu.com/">'.$node['cname']."</a></dt>"
  149. if (getChildTotal($node['id'])) 
  150. $tree_last = getChildArray($node['id']); 
  151. $html .= '<dd>'
  152. $html .= getTreeHTML($tree_last,$level); 
  153. $html .= '</dd>'
  154. $html .= '</dl>'
  155. return $html
  156. $html = getTreeHTML( getChildArray(0) ); 
  157. echo '<div id="tree_wrap" class="kyp_tree">'
  158. echo $html
  159. echo '</div><div id="show" style="clear:both;border-top:1px solid red"></div>'
  160. ?> 
  161. </body> 
  162. </html> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产午夜精品视频免费不卡69堂| 欧美日韩在线第一页| 国产精品福利观看| 日韩欧美在线一区| 国产成人一区二区| 日韩精品视频中文在线观看| 国产美女直播视频一区| 国产v综合v亚洲欧美久久| 九九视频这里只有精品| 韩国精品久久久999| 97国产精品视频人人做人人爱| 欧美激情一区二区三区在线视频观看| 欧美精品在线第一页| 亚洲韩国日本中文字幕| 欧美中文字幕在线播放| 欧美日韩在线第一页| 国产一区二区在线免费| 国产精品视频网| 精品久久久久久久中文字幕| 97香蕉久久夜色精品国产| 国产精品色视频| 国产欧美精品一区二区三区-老狼| 黄网站色欧美视频| 国产精品久久久久久五月尺| 国产亚洲精品一区二555| 欧美日韩免费在线| 亚洲精品永久免费| 91干在线观看| 色妞一区二区三区| 色777狠狠综合秋免鲁丝| 97久久精品在线| 久久精品人人做人人爽| 亚洲精品自拍视频| 日韩av在线最新| 久久亚洲影音av资源网| 欧美午夜无遮挡| 欧美极品少妇全裸体| 欧美日韩精品在线视频| 日韩欧美在线视频日韩欧美在线视频| 亚洲欧洲日产国产网站| 久久久99久久精品女同性| 一区三区二区视频| 日韩高清av一区二区三区| 欧美一区二三区| 久久99久国产精品黄毛片入口| 欧美黄色免费网站| 欧美高清性猛交| 亚洲精品99久久久久中文字幕| 在线丨暗呦小u女国产精品| 成人444kkkk在线观看| 精品欧美激情精品一区| 亚洲男人天堂2019| 精品国产美女在线| 国产亚洲欧美一区| 91爱爱小视频k| 国产精品成人品| 日韩在线视频网| 国产一区二区视频在线观看| 亚洲久久久久久久久久久| 国产aⅴ夜夜欢一区二区三区| 久久九九全国免费精品观看| 亚洲自拍偷拍第一页| 国产有码在线一区二区视频| 中文字幕欧美日韩在线| 欧美一级高清免费| 中文字幕日韩av| 亚洲自拍偷拍色片视频| 久久精品成人一区二区三区| 日韩风俗一区 二区| 91在线观看免费高清| 久久久国产视频| 91tv亚洲精品香蕉国产一区7ujn| 亚洲国产精品资源| 91亚洲国产成人精品性色| 欧美精品电影免费在线观看| 日韩一区二区av| 亚洲欧洲自拍偷拍| 欧美黑人xxxx| 中文字幕在线国产精品| 国产精品久久久久久久app| 尤物九九久久国产精品的分类| 日本一欧美一欧美一亚洲视频| 精品国产精品自拍| 俺也去精品视频在线观看| 成人夜晚看av| 成人激情视频在线| 亚洲风情亚aⅴ在线发布| 精品久久久久久久中文字幕| 精品久久久久国产| 亚洲午夜色婷婷在线| 欧美午夜xxx| 日韩成人久久久| 国产精品18久久久久久首页狼| 亚洲一区二区三区xxx视频| 成人夜晚看av| 91免费综合在线| 亚洲va电影大全| 亚洲无限乱码一二三四麻| 国产精品成人播放| 亚洲日韩中文字幕在线播放| 亚洲欧美中文在线视频| 亚洲国产成人91精品| 久久97久久97精品免视看| 91精品视频观看| 2019国产精品自在线拍国产不卡| 日本精品免费一区二区三区| 亚洲精品91美女久久久久久久| 亚洲成人性视频| 日韩av在线电影网| 亚洲第一页中文字幕| 亚洲成色999久久网站| 一区二区三区 在线观看视| 国产精品美女主播在线观看纯欲| 久久久免费电影| 国产成人在线播放| 成人在线小视频| 国产精品精品视频一区二区三区| 欧美亚洲在线视频| 欧美精品videos另类日本| 国产精品无码专区在线观看| 亚洲图片欧洲图片av| 日韩成人在线观看| 欧美有码在线观看视频| 亚洲视频自拍偷拍| 亚洲成人网在线观看| 日韩av在线网| 国产日韩在线观看av| 久久综合国产精品台湾中文娱乐网| 亚洲精品国产品国语在线| 久久久久久久久久久av| 不卡在线观看电视剧完整版| 国产精品日韩在线观看| 欧美韩日一区二区| 91久久久久久| 国产美女精品免费电影| 九九精品视频在线| 成人日韩av在线| 中文字幕亚洲一区二区三区| 亚洲国产精品小视频| 亚洲激情免费观看| 日韩av在线高清| 亚洲在线视频观看| 欧美精品久久久久久久久| 精品亚洲国产成av人片传媒| 欧美日韩亚洲视频| 日韩欧美黄色动漫| 91久久久精品| 久热爱精品视频线路一| 亚洲一区亚洲二区亚洲三区| 日本一区二三区好的精华液| 国产欧美va欧美va香蕉在| 色av吧综合网| 成人精品aaaa网站| 国产午夜精品视频| 久久免费少妇高潮久久精品99| 久久夜色精品亚洲噜噜国产mv| 精品小视频在线| 欧美日韩国产91| 久久久久999| 超碰97人人做人人爱少妇| 国产欧美久久一区二区| 少妇久久久久久| 韩日欧美一区二区| 福利精品视频在线|