php遞歸函數樹狀列表,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-tw/n/272090.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 00:08
下一篇 2024-12-17 00:08

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論