코드 복사 코드는 다음과 같습니다.
function cat_options($spec_cat_id, $arr)
{
static $ cat_options = array ();
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; '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;//정산
$level_array[$last_cat_id] = $level;//The 현재 노드의 다음 레벨 노드의 깊이
}
}
elseif ($value['parent_id'] > $last_cat_id)
{//현재 노드의 상위 노드의 깊이가 다음과 같은 경우 현재 상위 노드의 깊이보다 크면 다음 주기로 진행
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();
계속
}
}
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]
}
//전체 tree는 0부터 시작하여 처리 없이 직접 반환됩니다.
if (!$spec_cat_id)
{
return $options
} //그렇지 않으면 가로채기를 시작합니다. 다음은 비교적 간단합니다. 몇 가지 매개변수의 의미에 대해 이야기하겠습니다.
/*
$ spec_cat_id_level: 가로채는 노드의 깊이
$ spec_cat_id_array: 이 노드를 루트 노드로 하는 최종 반환된 제품 분류 트리
최종 반환된 배열은 다음과 같이 정렬됩니다. 상위 노드의 크기 기준, 직접 상위 노드는 동일한 루트에 따라 순회됩니다. 예:
첫 번째 수준 노드는 1,5, 두 번째 수준 노드는 2,6,7, 세 번째 수준 노드는 8,9입니다. 1의 직계 자식은 2입니다. ,6과 2의 직계 자식은 8,9입니다. 또한
5의 직계 자식은 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']
foreach ($options AS $key => $value)
{
if ($key ! = $spec_cat_id)
{
unset($options[$key])
}
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] = $spec_cat_id_array;
return $spec_cat_id_array; >
위 내용은 전기충격 중국어 음역을 포함하여 자세한 주석과 함께 ecshop 무한 분류 학습 참고 분석을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.