ecshop での無限分類の分析

WBOY
リリース: 2016-07-25 09:03:26
オリジナル
731 人が閲覧しました
  1. function cat_options($spec_cat_id, $arr)

  2. {
  3. static $cat_options = array();
  4. if (isset($cat_options[$spec_cat_id]))
  5. {
  6. return $cat_options[$spec_cat_id];
  7. }
  8. /*
  9. 初期化キーパラメータ:
  10. $level: 現在の子ノードの深さ
  11. $last_cat_id: 現在の親ノード ID
  12. $options: インデントレベルの配列
  13. $cat_id_array: 沿った親ノード同じパスが順番に配置されます
  14. $level_array: このノードの子ノードの深さも順番に配置されます
  15. */
  16. if (!isset($cat_options[0]))
  17. {
  18. $level = $last_cat_id = 0;
  19. $options = $cat_id_array = $level_array = array();
  20. while (!empty($arr))//構築すべきノードがまだある場合は、走査を続行します
  21. {
  22. foreach ($arr AS $key = > $value)
  23. {
  24. $cat_id = $value['cat_id'];
  25. //レベル 1 分類ノード
  26. if ($level == 0 && $last_cat_id == 0)
  27. {
  28. if ($value[' parent_id'] > 0)
  29. {
  30. break;
  31. }
  32. $options[$cat_id] = $value;
  33. $options[$cat_id]['level'] = $level;
  34. $options[$cat_id][' id'] = $cat_id;
  35. $options[$cat_id]['name'] = $value['cat_name'];
  36. //一度走査された後は走査されなくなります
  37. unset($arr[$key] ]);
  38. if ($value ['has_children'] == 0)
  39. {
  40. Continue;
  41. }
  42. $last_cat_id = $cat_id;//下位ノードの親ノード
  43. $cat_id_array = array($cat_id);
  44. $level_array[$last_cat_id] = ++$level;
  45. Continue;
  46. }
  47. //現在のノードの親ノードIDは上位ノードIDと等しい
  48. if ($value['parent_id'] == $last_cat_id)
  49. {
  50. $options [$cat_id] = $value;
  51. $options[$cat_id]['level'] = $level;
  52. $options[$cat_id]['id'] = $cat_id;
  53. $ options[$cat_id]['name '] = $value['cat_name'];
  54. unset($arr[$key]);//走査後は走査されなくなります
  55. //現在のノードに子がある場合、現在のノードは配置されますが、トラバースしなくなります。それ以外の場合は、
  56. if ($value['has_children'] > 0)
  57. {
  58. if (end($cat_id_array) != $last_cat_id を入力しないとトラバースされません) )
  59. {
  60. $cat_id_array[] = $last_cat_id;
  61. }
  62. $last_cat_id = $cat_id;//現在のノードが次のレベルのノードの新しい親ノードとして使用される場合
  63. $cat_id_array[] = $cat_id;/ /Enter

  64. $ level_array[$last_cat_id] = ++$level;//現在のノードの次のレベルのノードの深さ

  65. }

  66. }

  67. elseif ($value['parent_id'] > $last_cat_id )
  68. {//現在のノードの親の深さが現在の親ノードの深さよりも大きい場合は、次のサイクルに進みます
  69. break;
  70. }
  71. }/ /endforeach
  72. $count = count($cat_id_array);
  73. if ($count > ; 1)
  74. {
  75. //最後に入力した親ノードを現在の親ノードとして取り出します
  76. $last_cat_id = array_pop($cat_id_array);
  77. }
  78. elseif ($count == 1)
  79. {
  80. if ($last_cat_id != end( $cat_id_array))
  81. {
  82. //常駐親ノードが1つしかなく、それが現在の親ノードとして使用されていない場合は、それを取得out
  83. $last_cat_id = end($cat_id_array);
  84. }
  85. else
  86. { //それ以外の場合は、最後の親が取り出されます ノードは第 1 レベルの分類ノードでなければなりません
  87. $level = 0;
  88. $last_cat_id = 0;
  89. $ cat_id_array = array();
  90. continue;
  91. }
  92. }

  93. if ($last_cat_id && isset($level_array[$last_cat_id]))

  94. {
  95. // 現在のノードの深さを取得する
  96. $level = $level_array[$last_cat_id];
  97. }
  98. else
  99. {
  100. $level = 0;
  101. }
  102. }//end 一方、この時点では、ツリーを構築するための非再帰的事前順序トラバーサルの作業が行われます。 $options がルート ノードから始まるすべてのノードの階層配列を保存しました
  103. $cat_options[0] = $options
  104. }
  105. else
  106. {
  107. $options = $cat_options[0];
  108. }
  109. //ツリー全体が 0 から開始される場合は、直接返され、処理されなくなります。
  110. if (!$spec_cat_id)
  111. {
  112. return $options; //それ以外の場合は、指定されたノードからインターセプトを開始します。以下は比較的単純です。いくつかのパラメーターの意味について説明します。
  113. /*
  114. $spec_cat_id_level: インターセプトされたノードの深さ
  115. $spec_cat_id_array: 製品分類ツリー。このノードをルート ノードとして使用します
  116. 最終的に返される配列は、親ノードのサイズ、直接の親ノード、同じ親ノードなどによって並べ替えられます。 例:
  117. 第 1 レベルのノードは次のようになります。 1,5 の場合、第 2 レベルのノードは 2,6,7 になり、第 3 レベルのノードは 8,9 になります。1 の直接の子が 2,6 で、さらに 2 の直接の子が 8,9 になります。
  118. 5 の直接の子は 7 です。すると、最終的な配列は次のように配置されます 1->2->8->9->6->5->7
  119. */
  120. else
  121. {
  122. if ( empty($options[$spec_cat_id]))
  123. {
  124. return array();
  125. }
  126. $spec_cat_id_level = $options[$spec_cat_id]['level'];

  127. foreach ( $options AS $key => $value)

  128. {
  129. if ($key != $spec_cat_id)
  130. {
  131. unset($options[$key]);
  132. }
  133. else
  134. {
  135. break;
  136. }
  137. }
  138. $spec_cat_id_array = array();
  139. foreach ($options AS $key => $value)
  140. {
  141. if (($spec_cat_id_level == $value['level'] && $value['cat_id'] != $spec_cat_id ) |
  142. ($spec_cat_id_level > $value['level']))
  143. {
  144. break;
  145. }
  146. else
  147. {
  148. $spec_cat_id_array[$key] = $value;
  149. }
  150. }
  151. $cat_options[$spec_cat_id ] = $spec_cat_id_array;
  152. return $spec_cat_id_array;
  153. }
  154. }
  155. ?>

コードをコピー


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート