ホームページ  >  記事  >  バックエンド開発  >  PHP Infinitus 分類とは何を意味しますか?

PHP Infinitus 分類とは何を意味しますか?

(*-*)浩
(*-*)浩オリジナル
2019-09-16 14:18:423600ブラウズ

php Infinitus 分類 簡単に言うと、Windows が新しいフォルダーを作成するのと同じように、カテゴリを複数のサブカテゴリに分割し、さらに 1 つのサブカテゴリを他の複数のサブカテゴリに分割するなど、無限に分割できます。 in このフォルダー内にいくつかのフォルダーを作成することも、そのフォルダーの下にいくつかのフォルダーを作成することもできます。

PHP Infinitus 分類とは何を意味しますか?

#データベース ストレージ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。