Maison  >  Article  >  développement back-end  >  PHP réalise la classification infinie des menus

PHP réalise la classification infinie des menus

肚皮会动
肚皮会动original
2017-11-14 15:03:393904parcourir

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' => '安庆市'),
        );

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

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] => 浙江省 ) )

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' => '安庆市'),
);

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!

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