無限分類はすべてのプログラム開発で遭遇する問題です。ここで、php+mysql で実装された無限分類プログラムを紹介します。
私のデータベース構造をお見せしましょう: データベースの名前は: fa_category です
フィールド | タイプ | コメント |
シド | int(11) | カテゴリーID |
カテゴリ名 | varchar(255) | カテゴリ名 |
カテゴリータイプ | int(1) | カテゴリタイプ、1は単一ページ、2は一般カテゴリです |
キャットディル | varchar(255) | 英語カタログ |
ディスプレイ | int(1) | 1は表示、2は表示しないことを意味します |
キーワード | varchar(255) | コラムキーワード |
説明 | テキスト | コラム説明 |
時間 | int(11) | 作成時間 |
親ID | int(11) | 親ノードID、最上位ノードの親ノードは0です |
parentid フィールドを使用して親ノードの ID を記録します。parentid が 0 の場合、それは root です。さっそく、コードの書き方を見てみましょう。実現したい機能は次の図に示すとおりです:
このように表示するにはどうすればよいですか?私はこの質問について長い間考えてきました。まずこの SQL ステートメントを見てみましょう。
コードをコピー | |
SELECT c.cat_id、c.cat_name、c.measure_unit、c.parent_id、c.is_show、c.show_in_nav、c.grade、c.sort_order、COUNT( s.cat_id ) AS has_children
FROM ecs_category AS c |
代码如下 | 复制幣 |
パブリック関数 getCategory($catid=0,$re_type = true,$selected=0) { $db = new Public_DataBase(); $sql = 'select c.cid,c.catename,c.catetype,c.ctime,c.parentid,count(s.cid) as has_children from '. __MYSQL_PRE.'c 左結合としてのカテゴリ '. __MYSQL_PRE.'category as s on s.parentid=c.cid c.cid によるグループ c.parentid asc による順序'; $res = $db->selectTable($sql); $cateInfo = self::getChildTree($catid,$res); if($re_type==true) { $select = ''; foreach($cateInfo as $val) { $select .= ' $select .= ($selected == $val['cid']) ? "selected='ture'" : ''; $select .= '>'; if($val['レベル']>0) { $select .= str_repeat(' ', $val['level'] * 4); } $select .= htmlspecialchars(addslashes($val['catename']), ENT_QUOTES) 。 'オプション>'; } $select を返します; } それ以外 { foreach($cateInfo as $key=>$val) { if($val['レベル']>0) { $cateInfo[$key]['catename'] = "|".str_repeat(' ', $val['level'] * 8)."└─".$val['catename']; } } $cateInfo を返します; } } /** * 通过父ID递归得すべての子节点树 * @param int $catid 上级分类 * @param array $arr にはすべての分类の数グループが含まれます * @return 配列 */ パブリック関数 getChildTree($catid,$arr) { $level = $last_cat_id = 0; while (!empty($arr)) { foreach($arr as $key=>$value) { $cid = $value['cid']; if ($level == 0 && $last_cat_id == 0) { if ($value['parentid'] > 0) { 休憩; } $options[$cid] = $value; $options[$cid]['level'] = $level; $options[$cid]['id'] = $cid; $options[$cid]['name'] = $value['catename']; unset($arr[$key]); if ($value['has_children'] == 0) { 続けます; } $last_cat_id = $cid; $cat_id_array = 配列($cid); $level_array[$last_cat_id] = ++$level; 続けます; } if ($value['parentid'] == $last_cat_id) { $options[$cid] = $value; $options[$cid]['level'] = $level; $options[$cid]['id'] = $cid; $options[$cid]['name'] = $value['catename']; 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 = $cid; $cat_id_array[] = $cid; $level_array[$last_cat_id] = ++$level; } } elseif ($value['parentid'] > $last_cat_id) { 休憩; } } $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); } それ以外 { $レベル = 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]; } その他 { $レベル = 0; } } return $options; |
}Smarty ループを使用して表示します。効果は上の写真と同じです。ご質問がある場合は、メッセージを残してください。