Maison > développement back-end > tutoriel php > PHP crée un menu arborescent infini et un menu de liaison à trois niveaux

PHP crée un menu arborescent infini et un menu de liaison à trois niveaux

怪我咯
Libérer: 2023-03-13 11:44:01
original
3377 Les gens l'ont consulté

Cet article présente principalement la création de menus arborescents infinis en PHP. Il utilise principalement la fonction récursive Les amis intéressés peuvent se référer à

pour écrire des fonctions récursives et en 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');
Copier après la connexion

2. Obtenez les données de la base de données et placez-les dans le tableau :

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

Opération de base de donnéesJ'utilise la bibliothèque de classes pear Le format de données final de $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
 )
Copier après la connexion

3. . Convertir les données de l'étape précédente Le code d'un tableau en forme d'arbre 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);
Copier après la connexion

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

4. Convertir le tableau en forme d'arbre Le code html 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);
输出的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>
Copier après la connexion

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

6. Enfin, ajoutez un peu de style CSS, l'effet est le suivant :

L'ensemble du processus est très clair, et il convient très bien aux amis qui créent un arbre infini pour la première fois pour apprendre. J'espère que vous pourrez tous gagner quelque chose.

Ce qui suit est un menu de liaison à trois niveaux réalisé en utilisant php

Structure de la base de données

-- 表的结构 `bigclass` 
-- 
CREATE TABLE `bigclass` ( 
`bigclassid` int(11) NOT NULL auto_increment, 
`bigclassname` varchar(200) collate utf8_unicode_ci NOT NULL, 
`sort` int(11) NOT NULL, 
`suoshu` int(1) NOT NULL, 
PRIMARY KEY (`bigclassid`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=19 ; 
-- 表的结构 `smallclass` 
-- 
CREATE TABLE `smallclass` ( 
`smallclassid` int(11) NOT NULL auto_increment, 
`smallclassname` varchar(200) collate utf8_unicode_ci NOT NULL, 
`bigclassid` int(11) NOT NULL, 
`sort` int(11) NOT NULL, 
PRIMARY KEY (`smallclassid`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ; 
-- 表的结构 `minclass` 
-- 
CREATE TABLE `minclass` ( 
`minclassid` int(10) NOT NULL auto_increment, 
`minclassname` varchar(200) NOT NULL, 
`bigclassid` int(10) NOT NULL, 
`smallclassid` int(10) NOT NULL, 
`sort` int(10) NOT NULL, 
PRIMARY KEY (`minclassid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
Copier après la connexion

Le code est le suivant

<script language = "JavaScript"> 
var onecount; 
onecount=0; 
subcat = new Array(); 
<? 
//类别选择 
mysql_select_db($database_lr, $lr); 
$sql = "select * from smallclass order by sort"; 
$result = mysql_query( $sql ); 
$count = 0; 
while($res = mysql_fetch_row($result)){ 
?> 
subcat[<?=$count?>] = new Array("<?=$res[1]?>","<?=$res[4]?>","<?=$res[0]?>"); 
<? 
$count++; 
} 
?> 
onecount=<?php echo $count?> 
//联动函数 
function changelocation(bigclassid) 
{ 
document.myform.smallclassid.length = 0; 
var bigclassid=bigclassid; 
var i; 
document.myform.smallclassid.options[0] = new Option(&#39;请选择二级分类&#39;,&#39;&#39;); 
for (i=0;i < onecount; i++) 
{ 
if (subcat[i][1] == bigclassid) 
{ 
document.myform.smallclassid.options[document.myform.smallclassid.length] = new Option(subcat[i][0], subcat[i][2]); 
} 
} 
} 
</script> 
<?php 
mysql_select_db($database_lr, $lr); 
$sql2 = "select * from minclass order by sort"; 
$result2 = mysql_query( $sql2 ); 
$count2 = 0; 
?> 
<script language = "JavaScript"> 
//如果这个数组中含有双引号则不能使用。即二级和三级类不能含有双引号 
var onecount2; 
onecount2=0; 
subcat2 = new Array(); 
<?php 
$count2 = 0; 
while($res2 = mysql_fetch_row($result2)){ 
?> 
subcat2[<?php echo $count2?>] = new Array("<?php echo $res2[1]?>","<?php echo $res2[3]?>","<?php echo $res2[0]?>"); 
<?php 
$count2++; 
} 
?> 
onecount2=<?php echo $count2?>; 
function changelocation2(smallclassid) 
{ 
document.myform.minclassid.length = 0; 
var smallclassid=smallclassid; 
var j; 
document.myform.minclassid.options[0] = new Option(&#39;请选择三级分类&#39;,&#39;&#39;); 
for (j=0;j < onecount2; j++) 
{ 
if (subcat2[j][1] == smallclassid) 
{ 
document.myform.minclassid.options[document.myform.minclassid.length] = new Option(subcat2[j][0], subcat2[j][2]); 
} 
} 
} 
</script> 
<select name="bigclassid" onChange="changelocation(document.myform.bigclassid.options[document.myform.bigclassid.selectedIndex].value)" size="1"> 
<option selected value="">请指定一级分类</option> 
<? 
$sql = "select * from bigclass order by sort"; 
$result = mysql_query( $sql ); 
while($res = mysql_fetch_row($result)){ 
?> 
<option value="<? echo $res[0]; ?>"><? echo $res[1]?></option> 
<? } ?> 
</select> 
<select name="smallclassid" onChange="changelocation2(document.myform.smallclassid.options[document.myform.smallclassid.selectedIndex].value)" size="1"> 
<option selected value="">请指定二级分类</option> 
</select> 
<select name="minclassid" size="1"> 
<option selected value="">==所有三级分类==</option> 
</select>
Copier après la connexion

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:
php
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