Maison >développement back-end >Problème PHP >Que signifie la classification PHP Infinis ?

Que signifie la classification PHP Infinis ?

(*-*)浩
(*-*)浩original
2019-09-16 14:18:423656parcourir

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='无限极分类菜单存储表';

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" => '男性栏目',
    ],
];

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;
}

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);
}

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"
            }
        ]
    }
]

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!

Déclaration:
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