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

coldplay.xixi
Libérer: 2023-04-09 14:00:01
avant
3290 Les gens l'ont consulté

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), );
Copier après la connexion

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( //此处省略 ) ), ) ), //其他分类省略 )
Copier après la connexion

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);
Copier après la connexion

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 ( ) ) )
Copier après la connexion

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!

Étiquettes associées:
source:jb51.net
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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!