function cat_options($spec_cat_id, $arr){static $cat_options = 배열 ();if (isset($cat_options[$spec_cat_id])){return $cat_options[$spec_cat_id];}/*주요 매개변수 초기화:$level: 현재 하위 노드 깊이$last_cat_id: 현재 상위 노드 ID$options: 들여쓰기 수준이 있는 배열$cat_id_array: 동일한 경로에 있는 상위 노드가 순서대로 배치됩니다$ level_array : 이 노드의 하위 노드의 깊이도 순서대로 입력됩니다. */if (!isset($cat_options[0])){$level = $last_cat_id = 0; $options = $cat_id_array = $level_array = array();while (!empty($arr))//아직 구성할 노드가 있으면 계속 순회{foreach( $arr AS $key => $value) { $cat_id = $value['cat_id']; //레벨 1 분류 노드 if ($level == 0 && $ last_cat_id == 0 ) { if ($value['parent_id'] > 0) { break; } $options[$cat_id] = $value ; $options[$cat_id]['level'] = $level; $options[$cat_id]['id'] = $cat_id; $options[$cat_id]['name' ] = $value ['cat_name']; //순회 후 더 이상 순회하지 않음 unset($arr[$key]); if ($value['has_children'] == 0) { continue; } $last_cat_id = $cat_id;//하위 노드의 상위 노드 $cat_id_array = array($cat_id); $level_array[$ last_cat_id] = $level; continue; } //현재 노드의 상위 노드 ID가 해당 상위 노드 ID와 같습니다 if ($value['parent_id'] == $ last_cat_id ) { $options[$cat_id] = $value; $options[$cat_id]['level'] = $level; $options[$cat_id]['id' ] = $cat_id; $options[$cat_id]['name'] = $value['cat_name']; unset($arr[$key]);//반복 후 더 이상 순회하지 않음 //현재 노드에 하위 노드가 있는 경우 현재 노드는 배치되지만 통과되지 않습니다. 그렇지 않으면 배치되지 않고 다시 통과되지 않습니다. if ($value['has_children'] > 0) { if (end($cat_id_array) != $last_cat_id) { $cat_id_array[] = $last_cat_id; } $last_cat_id = $cat_id;/ /현재 노드가 다음 레벨 노드의 새로운 상위 노드로 사용되는 경우 $cat_id_array[] = $cat_id;//Enter $level_array[$last_cat_id] = $ level;//Current 노드의 다음 레벨 노드 깊이 } } elseif ($value['parent_id'] > $last_cat_id) { //if 현재 노드의 부모 깊이가 현재 부모 노드의 깊이보다 크면 다음 주기가 수행됩니다. break; } }//endforeach $count = count($cat_id_array); if ($count > 1) { //마지막으로 배치된 상위 노드를 현재 상위 노드로 꺼냅니다 $last_cat_id = array_pop($cat_id_array); } elseif ($count = = 1) { if ($last_cat_id != end($cat_id_array)) { //주둔된 상위가 하나만 있는 경우 노드이고 현재 상위 노드가 아니면 제거 $last_cat_id = end($cat_id_array); } else { //그렇지 않으면 제거된 마지막 상위 노드가 첫 번째 노드여야 합니다. -레벨 분류 노드 $level = 0; $last_cat_id = 0; $cat_id_array = array(); continue; } } if ($last_cat_id && isset($level_array[ $last_cat_id])) { //현재 노드의 깊이를 가져옵니다 $level = $level_array[$last_cat_id]; } else { $level = 0; } }//end 동안, 이때 트리를 구성하기 위한 비재귀적 선주문 순회 작업이 수행됩니다. $options는 $cat_options[0] = $options; } else { $ 배열의 계층적 성격을 지닌 루트 노드부터 시작하여 모든 노드를 저장했습니다. options = $cat_options[0]; } //0부터 시작하는 경우 전체 트리를 처음에 가져오면 처리 없이 바로 반환됩니다. if (!$spec_cat_id) { return $options; } //그렇지 않으면 다음과 같이 지정된 노드에서 가로채기를 시작합니다. 몇 가지 매개변수의 의미에 대해 조금 이야기하겠습니다. /* $spec_cat_id_level: 노드의 깊이를 가로채기 $spec_cat_id_array: 최종 반환된 노드는 해당 포인트의 상품 분류 트리 가 최종적으로 반환되고 배열이 정렬됩니다. 예를 들면 다음과 같습니다: 상위 노드의 크기, 직접 상위 노드 및 루트 순회와 같은 동일한 상위 노드별 예는 다음과 같습니다. 1 첫 번째 수준 노드는 1,5이고 두 번째 수준 노드는 다음과 같습니다. -레벨 노드는 2,6,7이고 세 번째 레벨 노드는 8,9입니다. 1의 직계 자식이 2,6이고 2의 직계 자식도 8,9인 경우 5; child가 7이면 최종 배열은 다음과 같이 배열됩니다. 1->2->8->9->6->5->7 */ else { if (empty($options[$spec_cat_id])) { return array(); } $spec_cat_id_level = $options[$spec_cat_id]['level'] < /p> foreach ($options AS $key => $value) { if ($key != $spec_cat_id) { unset( $options [$key]); } else { break; } } $spec_cat_id_array = array(); foreach ($options AS $ 키 => $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] = $spec_cat_id_array; return $spec_cat_id_array; } } ?> 코드 복사