>  기사  >  백엔드 개발  >  ECshop의 무한 분류 분석

ECshop의 무한 분류 분석

WBOY
WBOY원래의
2016-07-25 09:03:26734검색
  1. function cat_options($spec_cat_id, $arr)

  2. {
  3. static $cat_options = 배열 ();
  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;//Current 노드의 다음 레벨 노드 깊이

  65. }

  66. }

  67. elseif ($value['parent_id'] > $last_cat_id)
  68. { //if 현재 노드의 부모 깊이가 현재 부모 노드의 깊이보다 크면 다음 주기가 수행됩니다.
  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. //주둔된 상위가 하나만 있는 경우 노드이고 현재 상위 노드가 아니면 제거
  83. $last_cat_id = end($cat_id_array);
  84. }
  85. else
  86. { //그렇지 않으면 제거된 마지막 상위 노드가 첫 번째 노드여야 합니다. -레벨 분류 노드
  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. //그렇지 않으면 다음과 같이 지정된 노드에서 가로채기를 시작합니다. 몇 가지 매개변수의 의미에 대해 조금 이야기하겠습니다.
  115. /*
  116. $spec_cat_id_level: 노드의 깊이를 가로채기
  117. $spec_cat_id_array: 최종 반환된 노드는 해당 포인트의 상품 분류 트리
  118. 가 최종적으로 반환되고 배열이 정렬됩니다. 예를 들면 다음과 같습니다: 상위 노드의 크기, 직접 상위 노드 및 루트 순회와 같은 동일한 상위 노드별 예는 다음과 같습니다.
  119. 1 첫 번째 수준 노드는 1,5이고 두 번째 수준 노드는 다음과 같습니다. -레벨 노드는 2,6,7이고 세 번째 레벨 노드는 8,9입니다. 1의 직계 자식이 2,6이고 2의 직계 자식도 8,9인 경우
  120. 5; child가 7이면 최종 배열은 다음과 같이 배열됩니다. 1->2->8->9->6->5->7
  121. */
  122. else
  123. {
  124. if (empty($options[$spec_cat_id]))
  125. {
  126. return array();
  127. }
  128. $spec_cat_id_level = $options[$spec_cat_id]['level'] < /p>
  129. foreach ($options AS $key => $value)

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

코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.