Que signifie la classification PHP Infinis ?

(*-*)浩
Libérer: 2023-02-24 07:58:01
original
3610 Les gens l'ont consulté

La classification PHP Infinitus signifie simplement qu'une catégorie peut être divisée en plusieurs sous-catégories, puis une sous-catégorie peut être divisée en plusieurs autres sous-catégories et ainsi de suite indéfiniment, tout comme Windows peut créer un nouveau dossier, puis dans You peut créer des dossiers dans ce dossier, et vous pouvez également créer des dossiers sous le dossier

Que signifie la classification PHP Infinis ?

Stockage de base de données

La classification Infinitus est en fait un arbre, et tous les nœuds sont utilisés comme éléments de stockage. Chaque nœud peut avoir n'importe quel nombre de nœuds enfants et un seul nœud parent.

Le stockage de données MySQL, combiné à la structure de stockage des tables de données du projet est la suivante : (Apprentissage recommandé : Programmation PHP de l'entrée à la maîtrise)

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='无限极分类菜单存储表';
Copier après la connexion

Le domaine principal est l'identifiant unique du nœud lui-même Fid, et l'identifiant du nœud parent correspondant Fpid.

Implémentation technique

Nœud de stockage de données global

Les données du nœud sont stockées dans MySQL dans le projet. Maintenant, pour les tests, les données MySQL sont stockées. directement dans Dans le tableau, il est utilisé globalement. Les données sont stockées comme suit :

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" => '男性栏目',
    ],
];
Copier après la connexion

Méthode de référence pour obtenir une classification infinie

Idée :

1. all ending Les données sont regroupées dans un tableau indicé avec la clé primaire Fid (pk), afin que Fpid puisse être utilisé pour obtenir la colonne parent correspondante.

2. Parcourez les données empaquetées. S'il s'agit du nœud racine, ajoutez sa référence à l'arborescence. Sinon, ajoutez sa référence à l'élément enfant de sa classe parent. De cette façon, bien que seul le nœud racine soit ajouté à l'arborescence, si chaque nœud racine a des éléments enfants, il contient des références aux éléments enfants. Par conséquent, il peut former une forme d’arbre.

Personnellement, j'estime que les idées de conception citées sont plus faciles à comprendre et plus intuitives que les idées récursives.

Le code est le suivant :

/**
 * 把返回的数据集转换成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;
}
Copier après la connexion

Arbre d'appel de référence :

/**
 * 引用生成树
 * @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);
}
Copier après la connexion

Le résultat renvoyé est le suivant suit :

[
    {
        "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"
            }
        ]
    }
]
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal