本文目錄一覽:
- 1、php遞歸函數
- 2、PHP怎麼遞歸
- 3、php遞歸生成樹型數組
- 4、php 遞歸問題
- 5、PHP遞歸樹形菜單
php遞歸函數
遞歸其實就是“一個函數的自調用”
在這個“自調用”的過程中,必須要有一個變化的“參數”,當這個“參數”達到你的期望值的時候,終止該“自調用”過程
拿樓主的程序來說
demo($n)內部又有調用demo($n-1),構成了“自調用”
且,$n又有一個“期望值”,即是$n1,不滿足此條件時,該自調用終止
即是說,最後一個執行的demo是demo($n9-1),其中$n9=2,然後返回為1(因為執行了return 1)
則$n9*demo($n9-1)即等於 2*demo(2-1),又等於2*1=2;
則$n8*demo($n8-1)即等於 3*demo(3-1),又等於3*2=6;
則$n7*demo($n7-1)即等於 4*demo(4-1),又等於4*6=24;
……
依次類推
這樣想:
demo(1)是等於1,這個沒有疑問吧?
然後demo(2)等於2*demo(1)=2*1=2
然後demo(3)等於3*demo(2)=3*2=6
……
一直到demo(10)
PHP怎麼遞歸
下面我舉一個其他的例子,雖然不是族譜,但是原理都是一樣的。
在一些複雜的系統中,要求對信息欄目進行無限級的分類,以增強系統的靈活性。那麼PHP是如何實現無限級分類的呢?我們在本文中使用遞歸算法並結合mysql數據表實現無限級分類。
遞歸,簡單的說就是一段程序代碼的重複調用,當把代碼寫到一個自定義函數中,將參數等變量保存,函數中重複調用函數,直到達到某個條件才跳出,返回相應的數據。
Mysql
首先我們準備一張數據表class,記錄商品分類信息。表中有三個字段,id:分類編號,主鍵自增長;title:分類名稱;pid:所屬上級分類id。
class表結構:
CREATE TABLE IF NOT EXISTS `class` (
`id` mediumint(6) NOT NULL AUTO_INCREMENT,
`title` varchar(30) NOT NULL,
`pid` mediumint(6) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
插入數據後,如圖:
PHP
根據不同的需求,我們提供兩種不同格式的自定義函數,一種是返回字符串,一種是返回數組,兩種函數都使用了遞歸方法。先看返回字符串格式的函數:
function get_str($id = 0) {
global $str;
$sql = “select id,title from class where pid= $id”;
$result = mysql_query($sql);//查詢pid的子類的分類
if($result mysql_affected_rows()){//如果有子類
$str .= ‘ul’;
while ($row = mysql_fetch_array($result)) { //循環記錄集
$str .= “li” . $row[‘id’] . “–” . $row[‘title’] . “/li”; //構建字符串
get_str($row[‘id’]); //調用get_str(),將記錄集中的id參數傳入函數中,繼續查詢下級
}
$str .= ‘/ul’;
}
return $str;
}
以上函數get_str()通過遞歸,不斷查詢下級分類,並最終返回字符串,大家可以根據項目需求修改其中的str,最終生成一個無限分級列表:
include_once(‘connect.php’); //連接數據庫,connect.php文件自己寫一個啊
echo get_str(0); //輸出無限級分類
效果如:
接着我們來看返回數組格式的函數,一樣要使用遞歸:
function get_array($id=0){
$sql = “select id,title from class where pid= $id”;
$result = mysql_query($sql);//查詢子類
$arr = array();
if($result mysql_affected_rows()){//如果有子類
while($rows=mysql_fetch_assoc($result)){ //循環記錄集
$rows[‘list’] = get_array($rows[‘id’]); //調用函數,傳入參數,繼續查詢下級
$arr[] = $rows; //組合數組
}
return $arr;
}
}
函數get_array()返回了數組,這是我們期待的,所以筆者推薦使用get_array()得到數組,這樣一來,我們可以對數組進行任意操作,比如我們可以將數組轉換成json格式的數據傳給前端頁面,前端頁面可以通過解析json數據靈活展示分類信息。比如樹形結構的分類列表,下拉分類列表等。
include_once(‘connect.php’); //連接數據庫
$list = get_array(0); //調用函數
print_r($list); //輸出數組
輸出效果如:
如果要輸出json格式的數據,則可使用:
echo json_encode($list);
php遞歸生成樹型數組
public function tree($list, $parent) {
//保證找到的元素都放在一個數組$tree內,應該是$tree在所有的tree函數都共享
static $tree;
//遍歷該數組,找到parent值為當前傳遞進來的$parent_id;
foreach($list as $row) {
//判斷
if($row[‘parent’] == $parent) {
//保存起來
$tree[] = $row;
//依據當前所找到的分類,找到其子節點,操作相同,遞歸完成
$this-tree($list, $row[‘id’]);
}
}
return $tree;
}
你把你的數組帶進去,這個是在類裡面實現的,如果你只是想單獨用個方法,你就把public以及’$this-‘去掉就行了
php 遞歸問題
第一,沒有選擇數據庫,在連接數據庫後添加mysql_select_db(“數據庫名”);
第二、我感覺不代碼不全吧,因為我拷下來看了一下,少一},當然上面那個沒少,補充的少了。
第三、還有沒看出這個$ii是幹什麼用的。
第四、沒感覺$selec=0與不等於0輸出有什麼不同。
第五、以後最好是把html代碼與程序分開寫。
因為不知道需求,只能根據你的程序簡單修改如下:
?php
function TreeMenu($selec) {
$Conn=mysql_connect(“localhost”,”kk”,”kk123″);
mysql_select_db(“數據庫名”);
$ii=1;
$sql=”select * from tvmenu where bid=”.$selec;
$result=mysql_query($sql,$Conn);
$str = “”;
while($row =mysql_fetch_array($result)) {
if($selec=0) {
$str = ‘option value=”‘.$row[‘id’].'”‘.$row[‘name’].’/option ‘;
}else {
$str = ‘option value=”‘.$row[‘id’].'”‘.$row[‘name’].’/option ‘;
}
echo $str;
$ii++;
TreeMenu($row[‘id’]);
$ii–;
}
}
?
select name=”bid” id=”bid”
?php
TreeMenu(0);
?
/select
PHP遞歸樹形菜單
可以參考以下代碼,但需要把你自己的數據庫鏈接,表等改一下就可以了
html
head
link href=’style.css’ rel=stylesheet
meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /
script language=”JavaScript” src=”TreeMenu.js”/script
/head
body
?php
//基本變量設置
$GLOBALS[“ID”] =1; //用來跟蹤下拉菜單的ID號
$layer=1; //用來跟蹤當前菜單的級數
//連接數據庫
$Con=mysql_connect(“localhost”,”root”,”1234″);
mysql_select_db(“wiki”);
//提取一級菜單
$sql=”SELECT * FROM wiki where pid=0″;
$result=mysql_query($sql,$Con);
//如果一級菜單存在則開始菜單的顯示
if(mysql_num_rows($result)0) ShowTreeMenu($Con,$result,$layer,$ID);
//=============================================
//顯示樹型菜單函數 ShowTreeMenu($con,$result,$layer)
//$con:數據庫連接
//$result:需要顯示的菜單記錄集
//layer:需要顯示的菜單的級數
//=============================================
function ShowTreeMenu($Con,$result,$layer)
{
//取得需要顯示的菜單的項目數
$numrows=mysql_num_rows($result);
//開始顯示菜單,每個子菜單都用一個表格來表示
echo “table cellpadding=’0′ cellspacing=’0′ border=’0′”;
for($rows=0;$rows$numrows;$rows++)
{
//將當前菜單項目的內容導入數組
$menu=mysql_fetch_array($result);
//提取菜單項目的子菜單記錄集
$sql=”select * from wiki where pid=$menu[cid]”;
$result_sub=mysql_query($sql,$Con);
echo “tr”;
//如果該菜單項目有子菜單,則添加JavaScript onClick語句
if(mysql_num_rows($result_sub)0)
{
echo “td width=’20’img src=’folder.gif’ border=’0’/td”;
echo “td class=’Menu’ onClick=’javascript:ShowMenu(Menu”.$GLOBALS[“ID”].”);'”;
}
else
{
echo “td width=’20’img src=’file.gif’ border=’0’/td”;
echo “td class=’Menu'”;
}
//如果該菜單項目沒有子菜單,並指定了超級連接地址,則指定為超級連接,
//否則只顯示菜單名稱
//if($menu[url]!=””)
//echo “a href=’$menu[cid]’$menu[name]/a”;
//else
echo $menu[‘name’];
echo ”
/td
/tr
“;
//如果該菜單項目有子菜單,則顯示子菜單
if(mysql_num_rows($result_sub)0)
{
//指定該子菜單的ID和style,以便和onClick語句相對應
echo “tr id=Menu”.$GLOBALS[“ID”]++.” style=’display:none'”;
echo “td width=’20’ /td”;
echo “td”;
//將級數加1
$layer++;
//遞歸調用ShowTreeMenu()函數,生成子菜單
ShowTreeMenu($Con,$result_sub,$layer);
//子菜單處理完成,返回到遞歸的上一層,將級數減1
$layer–;
echo “/td/tr”;
}
//繼續顯示下一個菜單項目
}
echo “/table”;
}
?
/body
/html
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/272090.html