對ecshop中的無限級分類的分析

WBOY
發布: 2016-07-25 09:03:26
原創
732 人瀏覽過
  1. function cat_options($spec_cat_id, $arr)

  2. {
  3. static $cat_options = xic$caty ( ;
  4. if (isset($cat_options[$spec_cat_id]))
  5. {
  6. return $cat_options[$spec_cat_id];
  7. }
  8. /*
  9. 初始化關鍵參數:
  10. }
  11. /*
  12. 初始化關鍵參數:
  13. }
  14. /*
  15. 初始化關鍵參數:
  16. }
  17. /*
  18. 初始化關鍵參數:
  19. }
  20. /*
  21. 初始化關鍵參數:
  22. }
  23. /*
  24. 初始化關鍵參數:
  25. }
  26. /*
  27. 初始化關鍵參數:
  28. }
  29. /*
  30. 初始化關鍵參數:$last_cat_id:當前父節點ID
  31. $options:帶有縮排層級的陣列
  32. $cat_id_array:沿同一路徑的父節點依序進駐
  33. $level_array:此節點的子節點深度,也是依序進駐
  34. */
  35. if (!isset($cat_options[0]))
  36. {
  37. $level = $last_cat_id = 0;
  38. $options = $cat_id_array = $level_array = array();
  39. while (!empty($arr))//如果還有待建構的節點則繼續遍歷
  40. {
  41. foreach ($arr AS $key => $value)
  42. {
  43. $cat_id = $value['cat_id'];
  44. //一級分類結點
  45. if ($level == 0 && $last_cat_id == 0)
  46. {
  47. if ($value['parent_id'] > 0)
  48. {
  49. break;
  50. }
  51. $options[$cat_id] = $value;
  52. $options[$ cat_id]['level'] = $level;
  53. $options[$cat_id]['id'] = $cat_id;
  54. $options[$cat_id]['name'] = $value['cat_name' ];
  55. //遍歷過了就不再遍歷
  56. unset($arr[$key]);
  57. if ($value['has_children'] == 0)
  58. {
  59. continue;
  60. }
  61. $last_cat_id = $cat_id;//下層結點的父親結點
  62. $cat_id_array = array($cat_id);
  63. $level_array[$last_cat_id] = ++$level ;
  64. continue;
  65. }
  66. //當前結點的父親結點ID等於它的上一級結點ID
  67. if ($value['parent_id'] == $last_cat_id)
  68. {
  69. $options[$cat_id] = $value;
  70. $options[$cat_id]['level'] = $level;
  71. $options[$cat_id]['id'] = $level;
  72. $options[$cat_id]['id'] = $ cat_id;
  73. $options[$cat_id]['name'] = $value['cat_name'];
  74. unset($arr[$key]);//遍歷過了就不再遍歷
  75. //如果目前結點有孩子則當前結點要進駐,但不再遍歷;反之不進駐也不再遍歷
  76. if ($value['has_children'] > 0)
  77. {
  78. if (end($cat_id_array) != $last_cat_id)
  79. {
  80. $cat_id_array[] = $last_cat_id;
  81. }
  82. $last_cat_id = $cat_id;//當結點做為下一層現結點做為下一層現結結點的新的父親結點
  83. $cat_id_array[] = $cat_id;//進駐
  84. $level_array[$last_cat_id] = ++$level;//目前結點的下一級結點深度

  85. }
  86. }

  87. elseif ($value['parent_id'] > $last_cat_id)
  88. {//如果當前結點父親深度大於目前父親結點的深度則進行下一輪迴圈
  89. break;
  90. }
  91. }//endforeach
  92. $count = count($cat_id_array);
  93. if ($count > 1)
  94. {
  95. //取出最後進駐的父親節點作為當前父親節點
  96. $last_cat_id = array_pop($cat_id_array);
  97. }
  98. elseif ($count == 1)
  99. {
  100. if ($last_cat_id != end($cat_id_array))
  101. {
  102. //進駐的父親結點只有一個時並且沒有作為當前父親節點時把它取出
  103. $last_cat_id = end( $cat_id_array);
  104. }
  105. else
  106. { //否則最後取出的父親結點一定是一級分類結點
  107. $level = 0;
  108. $last_cat_id = 0;
  109. $cat_id_array = array();
  110. continue;
  111. }
  112. }
  113. if ($last_cat_id && isset($level_array[$last_cat_id])))

  114. {
  115. //取出當前結點的深度
  116. $level = $level_array[$last_cat_id];
  117. }
  118. else
  119. {
  120. $level = 0;
  121. }
  122. }//end while,此時已完成非遞歸前序遍歷構造樹的工作,其中$options已保存了從根結點開始的所有結點帶有分層性質的數組
  123. $cat_options[0 ] = $options;
  124. }
  125. else
  126. {
  127. $options = $cat_options[0];
  128. }
  129. //如果從0開始即取整棵樹則直接回傳不取整個樹則直接回傳不取再處理.
  130. if (!$spec_cat_id)
  131. {
  132. return $options;
  133. }
  134. //否則開始從指定結點截取,以下比較簡單我還是稍微說說吧,要說就說幾個參數意義吧
  135. /*
  136. $spec_cat_id_level:截取結點的深度
  137. $spec_cat_id_array:最終返回的以該結點為根結點的一棵商品分類樹
  138. 最終返回的數組是這樣排序的:按父親結點大小,按直接父親結點,按同一父親結點這樣的先根遍歷,具個例子:
  139. 一級結點有1,5 二級結點有2,6,7 三級結點有8,9,如果1的直接孩子是2,6而2的直接孩子是8,9;另外
  140. 5的直接孩子是7那麼最終的數組是這樣排列的1->2->8->9->6->5->7
  141. */
  142. else
  143. {
  144. if (empty($options[$spec_cat_id]) )
  145. {
  146. return array();
  147. }
  148. $spec_cat_id_level = $options[$spec_cat_id]['level'];
  149. foreach ($options AS $key => $value)

  150. {
  151. if ($key != $spec_cat_id)
  152. {
  153. unset($options[$key]);
  154. }
  155. else{break;}}$spec_cat_id_array = array();foreach ($options AS $key => $value){if ((( $spec_cat_id_level == $value['level'] && $value['cat_id'] != $spec_cat_id) ||($spec_cat_id_level > $value['level'])){break ;}else{$spec_cat_id_array[$key] = $value;}}$cat_options[$spec_cat_id] = $specspec_cat_id_arrayy; return $spec_cat_id_array;}}
  156. ?>
複製程式碼


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板