Maison  >  Article  >  développement back-end  >  Méthode pour réaliser une classification illimitée en PHP+Mysql

Méthode pour réaliser une classification illimitée en PHP+Mysql

coldplay.xixi
coldplay.xixiavant
2020-08-15 16:58:453357parcourir

Méthode pour réaliser une classification illimitée en PHP+Mysql

La classification infinie est un vieux sujet. Voyons comment implémenter PHP combiné avec Mysql.

[Recommandations d'apprentissage associées : programmation php(vidéo), tutoriel vidéo mysql]

La première méthode

Cette méthode est très courante et traditionnelle. Regardez d'abord la structure de la table

Table : catégorie
id int clé primaire, auto-incrémentation
nom varchar nom de la catégorie
pid int identifiant de classe parent, par défaut 0
Le pid par défaut de la catégorie supérieure est 0. Lorsque nous voulons supprimer l'arborescence des sous-catégories d'une certaine catégorie, l'idée de base est la récursivité. Bien entendu, en raison de problèmes d'efficacité, il n'est pas recommandé d'interroger la base de données pour chaque récursion. L'approche habituelle consiste à d'abord tout récupérer. catégories et enregistrez-les dans un tableau PHP, puis traitez-le et enfin mettez en cache les résultats pour améliorer l'efficacité de la requête suivante.

Construisez d'abord un tableau original, qui peut être extrait directement de la base de données :

Le code est le suivant :

$categories = array(
    array('id'=>1,'name'=>'电脑','pid'=>0),
    array('id'=>2,'name'=>'手机','pid'=>0),
    array('id'=>3,'name'=>'笔记本','pid'=>1),
    array('id'=>4,'name'=>'台式机','pid'=>1),
    array('id'=>5,'name'=>'智能机','pid'=>2),
    array('id'=>6,'name'=>'功能机','pid'=>2),
    array('id'=>7,'name'=>'超级本','pid'=>3),
    array('id'=>8,'name'=>'游戏本','pid'=>3),
);

Le but est de le convertir en la Structure suivante

Ordinateur
Ordinateur portable
Ultrabook
Ordinateur portable de jeu
Bureau
Téléphone portable
Smartphone
Machine fonctionnelle
Si représenté par un tableau, Vous pouvez ajouter une clé enfant pour stocker ses sous-catégories :

Le code est le suivant :

array(
    //1对应id,方便直接读取
    1 => array(
        'id'=>1,
        'name'=>'电脑',
        'pid'=>0,
        children=>array(
            &array(
                'id'=>3,
                'name'=>'笔记本',
                'pid'=>1,
                'children'=>array(
                    //此处省略
                )
            ),
            &array(
                'id'=>4,
                'name'=>'台式机',
                'pid'=>1,
                'children'=>array(
                    //此处省略
                )
            ),
        )
    ),
    //其他分类省略
)

Processus de traitement :

Le code est le suivant :

$tree = array();
//第一步,将分类id作为数组key,并创建children单元
foreach($categories as $category){
    $tree[$category['id']] = $category;
    $tree[$category['id']]['children'] = array();
}
//第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ($tree as $k=>$item) {
    if ($item['pid'] != 0) {
        $tree[$item['pid']]['children'][] = &$tree[$k];
    }
}
print_r($tree);

Le résultat de l'impression est le suivant :

Le code est le suivant :

Array
(
    [1] => Array
        (
            [id] => 1
            [name] => 电脑
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => 笔记本
                            [pid] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 7
                                            [name] => 超级本
                                            [pid] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                    [1] => Array
                                        (
                                            [id] => 8
                                            [name] => 游戏本
                                            [pid] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )
                    [1] => Array
                        (
                            [id] => 4
                            [name] => 台式机
                            [pid] => 1
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [2] => Array
        (
            [id] => 2
            [name] => 手机
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [name] => 智能机
                            [pid] => 2
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 6
                            [name] => 功能机
                            [pid] => 2
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [3] => Array
        (
            [id] => 3
            [name] => 笔记本
            [pid] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 7
                            [name] => 超级本
                            [pid] => 3
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 8
                            [name] => 游戏本
                            [pid] => 3
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [4] => Array
        (
            [id] => 4
            [name] => 台式机
            [pid] => 1
            [children] => Array
                (
                )
        )
    [5] => Array
        (
            [id] => 5
            [name] => 智能机
            [pid] => 2
            [children] => Array
                (
                )
        )
    [6] => Array
        (
            [id] => 6
            [name] => 功能机
            [pid] => 2
            [children] => Array
                (
                )
        )
    [7] => Array
        (
            [id] => 7
            [name] => 超级本
            [pid] => 3
            [children] => Array
                (
                )
        )
    [8] => Array
        (
            [id] => 8
            [name] => 游戏本
            [pid] => 3
            [children] => Array
                (
                )
        )
)

Avantages : La relation est claire, et elle est simple à modifier la relation supérieur-subordonné.

Inconvénients : en utilisant PHP pour traiter, si le nombre de catégories est énorme, l'efficacité sera également réduite.

La deuxième méthode

Cette méthode consiste à ajouter un champ chemin au champ table :

Table:catégorie
id int clé primaire , incrémentation automatique
name varchar classification name
pid int identifiant de classe parent, par défaut 0 0
2 Téléphone portable 0 0
3 Ordinateur portable 1 0-1

4 Ultrabook 3 0-1- 3

5 Game Book 3 0-1-3
le champ path enregistre la classification racine. Le chemin vers la classe parent de niveau supérieur est représenté par id+'-'.

De cette façon, en supposant que nous voulons interroger toutes les catégories descendantes sous l'ordinateur, nous n'avons besoin que d'une seule instruction SQL :

sélectionnez l'identifiant, le nom, le chemin de la catégorie où chemin comme (sélectionnez concat( path, '-',id,'%') comme chemin de la catégorie où id=1);
Résultat :

+----+----------- +- ------+

| identifiant | nom |

+----+----------+-------+
| 3 | Carnet de jeu | 0-1-3 | - --------+-------+

Cette méthode a également été adoptée par de nombreuses personnes, je l'ai résumée ci-dessous :


Avantages : requête facile, haute efficacité, chemin Les champs peuvent être indexés.

Inconvénients : La mise à jour des relations entre les nœuds est gênante et nécessite la mise à jour des champs de chemin de tous les descendants.

Ce qui précède représente l'intégralité du contenu de cet article, deux méthodes, laquelle préférez-vous ? J'espère que vous l'aimerez tous.

Recommandations associées :

Cours vidéo de programmation

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer