Maison  >  Article  >  développement back-end  >  PHP implémente de manière récursive un arbre de classification infini

PHP implémente de manière récursive un arbre de classification infini

大家讲道理
大家讲道理original
2017-05-18 18:09:3123138parcourir

Le diagramme arborescent infini peut être considéré comme une caractéristique distinctive de la colonne infinie. Jetons un coup d'œil à deux méthodes d'écriture différentes.

1. Conception de la base de données

CREATE TABLE `bg_cate` (
`cate_Id` int(30) unsigned NOT NULL AUTO_INCREMENT,
`cate_ParentId` int(30) unsigned DEFAULT '0',
`cate_Name` varchar(100) NOT NULL,
`cate_Intro` varchar(500) DEFAULT NULL,
`cate_Order` int(30) unsigned DEFAULT '0',
`cate_Icon` varchar(100) DEFAULT NULL,
PRIMARY KEY (`cate_Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=34 ;
--
-- 导出表中的数据 `bg_cate`
--
INSERT INTO `bg_cate` (`cate_Id`, `cate_ParentId`, `cate_Name`, `cate_Intro`, `cate_Order`, `cate_Icon`) VALUES
(4, 0, '往事如风', '记录往事', 0, 'icons/6.gif'),
(5, 0, '水煮三国', '品位三国智慧', 0, 'icons/3.gif'),
(2, 0, '技术学习', '平时学习的一些笔记,欢迎批评指正。', 0, 'icons/18.gif'),
(3, 0, '生活点滴', '记录生活点滴', 0, 'icons/2.gif'),
(6, 0, '栀子花开', '青春无限', 0, 'icons/8.gif'),
(7, 0, '假日休闲', '悠闲、自在', 0, 'icons/24.gif'),
(8, 2, 'html', 'html学习', 0, 'icons/1.gif'),
(9, 2, 'css', 'css学习', 0, 'icons/1.gif'),
(10, 2, 'php', 'php学习', 0, 'icons/18.gif'),
(11, 10, 'php基础知识', 'php基础知识', 0, 'icons/1.gif'),
(12, 10, 'oop', 'oop', 0, 'icons/1.gif'),
(13, 10, 'php安全', '讲述php安全', 0, 'icons/1.gif'),
(14, 10, 'seagull framework', 'seagull framework', 0, 'icons/1.gif'),
(15, 2, 'javascript', 'javascript学习', 0, 'icons/1.gif'),
(16, 2, '设计模式', NULL, 0, 'icons/1.gif'),
(17, 2, '软件工程', '软件工程学习', 0, 'icons/1.gif'),
(18, 3, '厦门生活', '厦门生活', 0, 'icons/8.gif'),
(19, 3, '大学生活', '大学生活', 0, 'icons/8.gif'),
(20, 3, '童年生活', '童年生活', 0, 'icons/15.gif'),
(21, 19, '学习', '学习', 0, 'icons/1.gif'),
(22, 19, '运动', '运动', 0, 'icons/16.gif'),
(23, 19, '旅游', '旅游', 0, 'icons/24.gif'),
(24, 22, '排球', '排球', 0, 'icons/9.gif'),
(25, 22, '篮球', '篮球', 0, 'icons/9.gif'),
(26, 22, '羽毛球', '羽毛球', 0, 'icons/9.gif'),
(27, 22, '乒乓球', '乒乓球', 0, 'icons/9.gif');

2. tableau.

require_once './classes/MyDB.php';
$con = MyDB::singleton();
$sql = <<<SQL
   select * from bg_cate cate
SQL;
$data = $con->getAll($sql);
//print_r($data);

J'utilise la bibliothèque de classes pear pour les opérations de base de données.
Le format des données du dernier $data est le suivant :

Array
(
   [0] => Array
       (
           [cate_Id] => 4
           [cate_ParentId] => 0
           [cate_Name] => 往事如风
           [cate_Intro] => 记录往事
           [cate_Order] => 0
           [cate_Icon] => icons/6.gif
       )
   [1] => Array
       (
           [cate_Id] => 5
           [cate_ParentId] => 0
           [cate_Name] => 水煮三国
           [cate_Intro] => 品位三国智慧
           [cate_Order] => 0
           [cate_Icon] => icons/3.gif
       )

3. Convertissez les données de l'étape précédente en un tableau en forme d'arborescence Le code est le suivant :

function getTree($data, $pId)
{
$tree = &#39;&#39;;
foreach($data as $k => $v)
{
  if($v[&#39;cate_ParentId&#39;] == $pId)
  {        //父亲找到儿子
   $v[&#39;cate_ParentId&#39;] = getTree($data, $v[&#39;cate_Id&#39;]);
   $tree[] = $v;
   //unset($data[$k]);
  }
}
return $tree;
}
$tree = getTree($data, 0);
Le format de données de sortie final de $tree est :


Array
(
   [0] => Array
       (
           [cate_Id] => 4
           [cate_ParentId] =>
           [cate_Name] => 往事如风
           [cate_Intro] => 记录往事
           [cate_Order] => 0
           [cate_Icon] => icons/6.gif
       )
   [1] => Array
       (
           [cate_Id] => 5
           [cate_ParentId] =>
           [cate_Name] => 水煮三国
           [cate_Intro] => 品位三国智慧
           [cate_Order] => 0
           [cate_Icon] => icons/3.gif
       )
   [2] => Array
       (
           [cate_Id] => 2
           [cate_ParentId] => Array
               (
                   [0] => Array
                       (
                           [cate_Id] => 8
                           [cate_ParentId] =>
                           [cate_Name] => html
                           [cate_Intro] => html学习
                           [cate_Order] => 0
                           [cate_Icon] => icons/1.gif
                       )

4. Convertissez le tableau arborescent en htmlLe code est le suivant :

function procHtml($tree)
{
$html = &#39;&#39;;
foreach($tree as $t)
{
  if($t[&#39;cate_ParentId&#39;] == &#39;&#39;)
  {
   $html .= "<li>{$t[&#39;cate_Name&#39;]}</li>";
  }
  else
  {
   $html .= "<li>".$t[&#39;cate_Name&#39;];
   $html .= procHtml($t[&#39;cate_ParentId&#39;]);
   $html = $html."</li>";
  }
}
return $html ? &#39;<ul>&#39;.$html.&#39;</ul>&#39; : $html ;
}
echo procHtml($tree);
Le format de code du html de sortie est :


<ul>
<li>往事如风</li>
<li>水煮三国</li>
<li>技术学习
  <ul>
   <li>html</li>
   <li>css</li>
   <li>php
    <ul>
     <li>php基础知识</li>
     <li>oop</li>
     <li>php安全</li>

5. Intégration du code

function getTree($data, $pId)
{
$html = &#39;&#39;;
foreach($data as $k => $v)
{
  if($v[&#39;cate_ParentId&#39;] == $pId)
  {        //父亲找到儿子
   $html .= "<li>".$v[&#39;cate_Name&#39;];
   $html .= getTree($data, $v[&#39;cate_Id&#39;]);
   $html = $html."</li>";
  }
}
return $html ? &#39;<ul>&#39;.$html.&#39;</ul>&#39; : $html ;
}
echo getTree($data, 0);

6. Ajouter des styles CSS

PHP implémente de manière récursive un arbre de classification infini


Le deuxième type, je l'ai vu sur un site Web open source, et c'est une très brève introduction.

<?php
 
function genTree5($items) { 
    foreach ($items as $item) 
        $items[$item[&#39;pid&#39;]][&#39;son&#39;][$item[&#39;id&#39;]] = &$items[$item[&#39;id&#39;]]; 
    return isset($items[0][&#39;son&#39;]) ? $items[0][&#39;son&#39;] : array(); 
} 
 
/**
 * 将数据格式化成树形结构
 * @author Xuefen.Tong
 * @param array $items
 * @return array 
 */
function genTree9($items) {
    $tree = array(); //格式化好的树
    foreach ($items as $item)
        if (isset($items[$item[&#39;pid&#39;]]))
            $items[$item[&#39;pid&#39;]][&#39;son&#39;][] = &$items[$item[&#39;id&#39;]];
        else
            $tree[] = &$items[$item[&#39;id&#39;]];
    return $tree;
}
 
$items = array(
    1 => array(&#39;id&#39; => 1, &#39;pid&#39; => 0, &#39;name&#39; => &#39;江西省&#39;),
    2 => array(&#39;id&#39; => 2, &#39;pid&#39; => 0, &#39;name&#39; => &#39;黑龙江省&#39;),
    3 => array(&#39;id&#39; => 3, &#39;pid&#39; => 1, &#39;name&#39; => &#39;南昌市&#39;),
    4 => array(&#39;id&#39; => 4, &#39;pid&#39; => 2, &#39;name&#39; => &#39;哈尔滨市&#39;),
    5 => array(&#39;id&#39; => 5, &#39;pid&#39; => 2, &#39;name&#39; => &#39;鸡西市&#39;),
    6 => array(&#39;id&#39; => 6, &#39;pid&#39; => 4, &#39;name&#39; => &#39;香坊区&#39;),
    7 => array(&#39;id&#39; => 7, &#39;pid&#39; => 4, &#39;name&#39; => &#39;南岗区&#39;),
    8 => array(&#39;id&#39; => 8, &#39;pid&#39; => 6, &#39;name&#39; => &#39;和兴路&#39;),
    9 => array(&#39;id&#39; => 9, &#39;pid&#39; => 7, &#39;name&#39; => &#39;西大直街&#39;),
    10 => array(&#39;id&#39; => 10, &#39;pid&#39; => 8, &#39;name&#39; => &#39;东北林业大学&#39;),
    11 => array(&#39;id&#39; => 11, &#39;pid&#39; => 9, &#39;name&#39; => &#39;哈尔滨工业大学&#39;),
    12 => array(&#39;id&#39; => 12, &#39;pid&#39; => 8, &#39;name&#39; => &#39;哈尔滨师范大学&#39;),
    13 => array(&#39;id&#39; => 13, &#39;pid&#39; => 1, &#39;name&#39; => &#39;赣州市&#39;),
    14 => array(&#39;id&#39; => 14, &#39;pid&#39; => 13, &#39;name&#39; => &#39;赣县&#39;),
    15 => array(&#39;id&#39; => 15, &#39;pid&#39; => 13, &#39;name&#39; => &#39;于都县&#39;),
    16 => array(&#39;id&#39; => 16, &#39;pid&#39; => 14, &#39;name&#39; => &#39;茅店镇&#39;),
    17 => array(&#39;id&#39; => 17, &#39;pid&#39; => 14, &#39;name&#39; => &#39;大田乡&#39;),
    18 => array(&#39;id&#39; => 18, &#39;pid&#39; => 16, &#39;name&#39; => &#39;义源村&#39;),
    19 => array(&#39;id&#39; => 19, &#39;pid&#39; => 16, &#39;name&#39; => &#39;上坝村&#39;),
);
echo "<pre class="brush:php;toolbar:false">";
print_r(genTree5($items));
print_r(genTree9($items));
 
//后者输出格式,前者类似,只是数组键值不一样,不过不影响数据结构
/*
Array
(
[0] => Array
    (
        [id] => 1
        [pid] => 0
        [name] => 江西省
        [son] => Array
            (
                [0] => Array
                    (
                        [id] => 3
                        [pid] => 1
                        [name] => 南昌市
                    )
 
                [1] => Array
                    (
                        [id] => 13
                        [pid] => 1
                        [name] => 赣州市
                        [son] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 14
                                        [pid] => 13
                                        [name] => 赣县
                                        [son] => Array
                                            (
                                            [0] => Array
                                                (
                                                    [id] => 16
                                                    [pid] => 14
                                                    [name] => 茅店镇
                                                    [son] => Array
                                                        (
                                                        [0] => Array
                                                            (
                                                            [id] => 18
                                                            [pid] => 16
                                                            [name] => 义源村
                                                            )
 
                                                        [1] => Array
                                                            (
                                                            [id] => 19
                                                            [pid] => 16
                                                            [name] => 上坝村
                                                            )
 
                                                        )
 
                                                )
 
                                            [1] => Array
                                                (
                                                    [id] => 17
                                                    [pid] => 14
                                                    [name] => 大田乡
                                                )
 
                                            )
 
                                    )
 
                                [1] => Array
                                    (
                                        [id] => 15
                                        [pid] => 13
                                        [name] => 于都县
                                    )
 
                            )
 
                    )
 
            )
 
    )
 
[1] => Array
    (
        [id] => 2
        [pid] => 0
        [name] => 黑龙江省
        [son] => Array
            (
                [0] => Array
                    (
                        [id] => 4
                        [pid] => 2
                        [name] => 哈尔滨市
                        [son] => Array
                            (
                            [0] => Array
                                (
                                    [id] => 6
                                    [pid] => 4
                                    [name] => 香坊区
                                    [son] => Array
                                        (
                                        [0] => Array
                                            (
                                                [id] => 8
                                                [pid] => 6
                                                [name] => 和兴路
                                                [son] => Array
                                                    (
                                                        [0] => Array
                                                            (
                                                            [id] => 10
                                                            [pid] => 8
                                                            [name] => 
                                                             东北林业大学
                                                            )
 
                                                        [1] => Array
                                                            (
                                                            [id] => 12
                                                            [pid] => 8
                                                            [name] => 
                                                            哈尔滨师范大学
                                                            )
 
                                                    )
 
                                            )
 
                                        )
 
                                )
 
                            [1] => Array
                                (
                                    [id] => 7
                                    [pid] => 4
                                    [name] => 南岗区
                                    [son] => Array
                                        (
                                        [0] => Array
                                            (
                                            [id] => 9
                                            [pid] => 7
                                            [name] => 西大直街
                                            [son] => Array
                                                (
                                                [0] => Array
                                                    (
                                                    [id] => 11
                                                    [pid] => 9
                                                    [name] => 
                                                     哈尔滨工业大学
                                                    )
 
                                                )
 
                                            )
 
                                        )
 
                                )
 
                            )
 
                    )
 
                [1] => Array
                    (
                        [id] => 5
                        [pid] => 2
                        [name] => 鸡西市
                    )
 
            )
 
    )
)*/
On voit que le deuxième code n'utilise que 5 lignes de code pour réaliser un arbre de classification infini, ce qui est très digne de référence et d'apprentissage de chacun.

Si vous souhaitez en savoir plus sur PHP, continuez à prêter attention au site Web chinois PHP

[Plus de téléchargements de bibliothèques]

1

bibliothèque de pagination php. télécharger 2. bibliothèque de traitement d'images php 3 Télécharger la bibliothèque de codes de vérification 4. >Bibliothèque de classes de téléchargement de fichiers 5. Classe de traitement de chaînes 6.
Bibliothèque de catégories 7.Bibliothèque de classes d'opérations de base de données 8.Bibliothèque de classes ip 9.Bibliothèque de classes de cache 10 .Bibliothèque de classes du moteur de modèles Articles connexes :

php utilise une méthode récursive pour implémenter une classification infinie

Révéler le principe de la classification illimitée en PHP

Analyse de la méthode d'implémentation de la classification illimitée en PHP

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