Maison  >  Article  >  développement back-end  >  PHP utilise la récursivité pour créer un menu arborescent infini

PHP utilise la récursivité pour créer un menu arborescent infini

墨辰丷
墨辰丷original
2018-06-06 11:28:281441parcourir

Cet article présente principalement l'utilisation de la récursivité en PHP pour créer un menu arborescent infini. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Lors de l'écriture de fonctions récursives, vous pouvez envisager de mettre en cache et de définir certaines variables statiques pour stocker les résultats de l'exécution précédente. Ceci est très utile pour l'efficacité de l'exécution de plusieurs programmes.
Les étapes approximatives sont les suivantes :
étape 1 :Récupérez les données de la base de données et placez-les dans un tableau,
étape 2 :Convertissez les données en un tableau en forme d'arbre,
étape 3 : Convertissez ce tableau en forme d'arbre en code HTML.
Vous pouvez également combiner les deuxième et troisième étapes en une seule étape.
Les détails sont les suivants :
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. Pour que la base de données récupère les données et les place dans un 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 , et le dernier $data Le format des données 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. Le code pour convertir les données dans le L'étape précédente dans un tableau en forme d'arbre est la suivante :

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 code html comme suit :

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);
输出的html的代码格式为:
<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. Vous pouvez également combiner les codes aux étapes 3 et 4. Le code est le suivant :

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. Enfin, ajoutez un peu de style CSS, l'effet est le suivant :

Résumé : Ce qui précède est le tout le contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun.

Recommandations associées :

php combine la soumission sans actualisation ajax de jQuery pour implémenter la fonction like

loterie aléatoire probabiliste php Cas

Cas du système de favoris 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