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; $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;
}
//現在のノードの親ノード ID はその親ノード ID と同じです
if ($value['parent_id'] = = $last_cat_id)
{
$options[$cat_id] = $value;
$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 ;//現在のノードの次のレベルのノードの深さ
}
}
elseif ($value['parent_id'] > $last_cat_id)
{//現在のノードの親の深さが現在の親ノードの深さより大きい場合は、次のサイクルに進みます
}
}//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))
{
//常駐している親ノードが1つしかない場合、現在の親ノードでない場合は外す
$last_cat_id = end($cat_id_array)
}
else
{ // それ以外の場合、取り出される最後の親ノードは第 1 レベルの分類ノードでなければなりません
$level = 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];
}
// 0 から始まる場合、ツリー全体を取得すると返されます
if (!$spec_cat_id)
{
return $options;
//それ以外の場合は、指定されたノードからインターセプトを開始します。これについて少し説明します。いくつかのパラメータの意味
/*
$spec_cat_id_level: インターセプトされたノードの深さ
$spec_cat_id_array: このノードをルート ノードとする製品分類ツリーが最終的に返されます
最終的に返された配列は次のようにソートされます:親ノードは、直接の親ノードと同じ親ノードに従ってトラバースされます。例を次に示します。
第 1 レベルのノードは 1、5、第 2 レベルのノードは 2、6、7、そして第 3 レベルのノードです。が 8,9 で、1 の直接の子が 2,6 で、2 の直接の子が 8,9 である場合、
5 の直接の子が 7 である場合、最終的な配列は次のように配置されます。 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]);
}
{
break;
}
}
$spec_cat_id_array = array();
{
if (($spec_cat_id_level) == $value['level '] && $value['cat_id'] != $spec_cat_id) ||
($spec_cat_id_level > $value['level']))
{
}
else
{
$spec_cat_id_array[$key] = $value;
}
}
$cat_options[$spec_cat_id] = $spec_cat_id_array
$spec_cat_id_array;
http://www.bkjia.com/PHPjc/321477.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/321477.html技術記事次のようにコードをコピーします。 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id])) { return $cat_options[$spec_cat_id] } /...