PHP réalise la classification infinie des menus

肚皮会动
Libérer: 2023-03-17 13:56:01
original
3898 Les gens l'ont consulté

Cet article présente en détail l'utilisation de PHP pour implémenter les menusClassification InfinitusLes menus généraux du projet sont affichés différemment selon les différents utilisateurs et les différentes connexions de rôle. utiliser if Cela semble maladroit de juger par else, et il est très difficile de modifier le menu. Le meilleur moyen est de stocker le menu dans la base de données, puis de le récupérer dans la base de données, de le parcourir et de l'afficher sur la page. Le but de cet article est de interroger les données et comment faire correspondre les niveaux supérieur et inférieur du menu un par un. Une technologie de classification infinie est utilisée.

Données de menu

Nos données de menu ici sont des données temporaires et ne sont pas interrogées et traitées à partir de la base de données. Les données sont fondamentalement similaires à celles de la base de données. :

$items = array(
            1 => array('id' => 1, 'pid' => 0, 'name' => '安徽省'),
            2 => array('id' => 2, 'pid' => 0, 'name' => '浙江省'),
            3 => array('id' => 3, 'pid' => 1, 'name' => '合肥市'),
            4 => array('id' => 4, 'pid' => 3, 'name' => '长丰县'),
            6 => array('id' => 6, 'pid' => 4, 'name' => '小溪村'),
            5 => array('id' => 5, 'pid' => 1, 'name' => '安庆市'),
        );
Copier après la connexion

Les données ici sont également remplacées par les données réelles interrogées dans la base de données.

Créer un menu Méthode de classification Infinitus

   function generateTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
    $tree     = array();
    $packData = array();
    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

Code d'analyse Le code ci-dessus : C'est plus important. L'endroit est l'endroit où le commentaire se trouve dans le code, point 1, point 2.
1 D'abord parcourez le tableau
2. . Le point 1 signifie déterminer si le menu racine, si c'est le cas, alors prenez le tableau du menu racine et attribuez la référence du tableau au nouveau tableau
4. Le point 2 signifie que le tableau de sous-classe est attribué au tableau avec la clé. $child dans le tableau de la classe parent
5 . Le résultat final est un tableau avec une structure arborescente

Le résultat est le suivant :

Array ( 
[0] => Array ( [id] => 1 [pid] => 0 [name] => 安徽省 [son] => Array ( [0] => Array ( [id] => 3 [pid] => 1 [name] => 合肥市 [son] => Array ( [0] => Array ( [id] => 4 [pid] => 3 [name] => 长丰县 [son] => Array ( [0] => Array ( [id] => 6 [pid] => 4 [name] => 小溪村 ) ) ) ) ) 
[1] => Array ( [id] => 5 [pid] => 1 [name] => 安庆市 ) ) )
 [1] => Array ( [id] => 2 [pid] => 0 [name] => 浙江省 ) )
Copier après la connexion

Retourne le résultat au premier plan. à la fin, ajoutez l'élément HTML, le menu L'effet apparaît

Résumé

1 La difficulté d'utiliser PHP pour faire Infinitus est &. valeur, mais en attribuant une référence à un tableau, afin que le même élément de contenu puisse être manipulé
2. L'affectation de référence est généralement utilisée dans les tableaux, les objets, tels que php $arr=&$. arr1, $CustomerTwo=&$Customer, qui n'en ouvrira pas de nouveaux dans l'espace mémoire, mais transmettra la référence aux données en mémoire à la nouvelle variable
3. et il est plus facile à utiliser. La récursivité présente de nombreux inconvénients
4. La méthode ci-dessus n'est pas la meilleure, vous pouvez trouver d'autres méthodes en ligne, comme la fonction suivante :

function generateTree($items){
    $tree = array();
    foreach($items as $item){
        if(isset($items[$item['pid']])){
            $items[$item['pid']]['son'][] = &$items[$item['id']];
        }else{
            $tree[] = &$items[$item['id']];
        }
    }
    return $tree;
}
//测试数据
$items = array(
    1 => array('id' => 1, 'pid' => 0, 'name' => '安徽省'),
    2 => array('id' => 2, 'pid' => 0, 'name' => '浙江省'),
    3 => array('id' => 3, 'pid' => 1, 'name' => '合肥市'),
    4 => array('id' => 4, 'pid' => 3, 'name' => '长丰县'),
    7 => array('id' => 6, 'pid' => 4, 'name' => '小溪村'),
    5 => array('id' => 5, 'pid' => 1, 'name' => '安庆市'),
);
Copier après la connexion

Cette méthode peut effectivement produire l'effet, et seulement si une boucle semble être très efficace, mais elle a un plus gros problème, c'est-à-dire que la valeur id doit être cohérente avec sa valeur clé correspondante. Je ne comprends pas, je peux le tester par eux-mêmes. J'espère que cela vous sera utile.

Recommandations associées :

Processus de développement et exemple de code pour l'implémentation récursive php d'une classification à niveau infini

Exemple de classification php à niveau infini code

Trois façons d'obtenir une classification infinie en php

Analyse des méthodes pour obtenir une classification infinie en php

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: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
À 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!