php Infinitus 分類 簡単に言うと、Windows が新しいフォルダーを作成するのと同じように、カテゴリを複数のサブカテゴリに分割し、さらに 1 つのサブカテゴリを他の複数のサブカテゴリに分割するなど、無限に分割できます。 in このフォルダー内にいくつかのフォルダーを作成することも、そのフォルダーの下にいくつかのフォルダーを作成することもできます。
#データベース ストレージ
Infinitus 分類は実際にはツリーであり、すべてのノードが 1 つの記憶要素として含まれます。各ノードは、任意の数の子ノードを持つことができ、親ノードは 1 つだけを持つことができます。 MySQL データ ストレージとプロジェクトのデータ テーブル ストレージ構造を組み合わせたものは次のとおりです: (推奨される学習:PHP プログラミングの入門から熟練度まで) CREATE TABLE t_tree_info ( `Fid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '标签自增ID', `Fname`
varchar(255) NOT NULL DEFAULT '' COMMENT '节点名称', `Fpid` bigint(20) unsigned NOT NULL DEFAULT 0
COMMENT '父节点id', `Fadd_time` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
`Fmodify_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`Fid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='无限极分类菜单存储表';
コア フィールドは次のとおりです。ノード自体の一意の識別子 Fid と、対応する親ノードの識別子 Fpid。
グローバル データ ストレージ ノード
ノード データはプロジェクトの MySQL に保存されます。テストのために、MySQL データが保存されます。配列内で直接使用され、グローバルに使用されます。データは次のように保存されます:
private static $listData = [ [ "Fid" => 1, "Fpid" => 8, "Fname" => '首页', ], [ "Fid" => 2, "Fpid" => 8, "Fname" => '博客', ], [ "Fid" => 3, "Fpid" => 8, "Fname" => '官网', ], [ "Fid" => 4, "Fpid" => 2, "Fname" => '个人博客', ], [ "Fid" => 5, "Fpid" => 2, "Fname" => '他人博客', ], [ "Fid" => 6, "Fpid" => 8, "Fname" => '测试1', ], [ "Fid" => 7, "Fpid" => 8, "Fname" => '测试2', ], [ "Fid" => 8, "Fpid" => 0, "Fname" => '无限极分类', ], [ "Fid" => 9, "Fpid" => 5, "Fname" => '女性栏目', ], [ "Fid" => 10, "Fpid" => 5, "Fname" => '男性栏目', ], ];無限分類を実現するための参照方法
アイデア:
1、つまりデータは主キー Fid (pk) で添え字が付いた配列にパッケージ化されるため、Fpid を使用して対応する親列を取得できます。
2. パッケージ化されたデータをループします。ルート ノードの場合は、その参照をツリーに追加します。そうでない場合は、その参照を親クラスの子要素に追加します。このように、ルート ノードのみがツリーに追加されますが、各ルート ノードに子要素がある場合は、子要素への参照が含まれます。したがって、樹形を形成することができます。
個人的には、再帰的なアイデアよりも、引用されたデザイン アイデアの方が理解しやすく、直感的であると感じます。
コードは次のとおりです:/**
* 把返回的数据集转换成Tree
* @param array $list 要转换的数据集
* @param string $pk 自增字段(栏目Fid)
* @param string $pid parent标记字段
* @return array
*/
public static function quote_make_tree($list, $pk = 'Fid', $pid = 'Fpid',$child = '_child', $root = 0)
{
$tree = $packData = [];
foreach ($list as $data) {
$packData[$data[$pk]] = $data;
}
foreach ($packData as $key =>$val) {
if ($val[$pid] == $root) {//代表跟节点
$tree[] = & $packData[$key];
} else {
//找到其父类
$packData[$val[$pid]][$child][] = & $packData[$key];
}
}
return $tree;
}
/**
* 引用生成树
* @return
*/
public static function quote_tree_test()
{
$tree = self::make_tree(self::$listData, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0);
echo json_encode($tree);
}
[ { "Fid": 8, "Fpid": 0, "Fname": "无限极分类", "_child": [ { "Fid": 1, "Fpid": 8, "Fname": "首页" }, { "Fid": 2, "Fpid": 8, "Fname": "博客", "_child": [ { "Fid": 4, "Fpid": 2, "Fname": "个人博客" }, { "Fid": 5, "Fpid": 2, "Fname": "他人博客", "_child": [ { "Fid": 9, "Fpid": 5, "Fname": "女性栏目" }, { "Fid": 10, "Fpid": 5, "Fname": "男性栏目" } ] } ] }, { "Fid": 3, "Fpid": 8, "Fname": "官网" }, { "Fid": 6, "Fpid": 8, "Fname": "测试1" }, { "Fid": 7, "Fpid": 8, "Fname": "测试2" } ] } ]
以上がPHP Infinitus 分類とは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。