php遞歸返回
『壹』 php寫函數 根據子類(id)遞歸查找頂級父類(id) 返回父類名字 (表結構:id name pid)
你這種表結構叫鄰接緩租表,查詢或皮的方式通過自連接。如
SELECTt1.nameASlev1,t2.nameaslev2,t3.nameaslev3,t4.nameaslev4
FROMTbnameASt1
LEFTJOINTbnameASt2ONt2.pid=t1.id
LEFTJOINTbnameASt3ONt3.pid=t2.id
LEFTJOINTbnameASt4ONt4.pid=t3.id
WHEREt1.name='XXXX'
這種方法的主要局限是你需要為每層數據添加一個自連接,隨著層次的增加,自連接
變得越來越復雜,檢索的性能自然而然的也就下降了。當然這種結構在查詢前必須知道該節點所處的層級,否則無法確定自連接的深度。
鄰接表模型衫哪差的局限性很大,用純sql實現有一定的難度。不妨考慮其他模型,比如嵌套模型。
嵌套模型的基本結構是樹型結構,SQL檢索比鄰接表要方便很多。
關於嵌套模型,PHPChina的第一期電子雜志PHPer也有過深入探討,請參考!
『貳』 php的遞歸問題,$arr[$key]=doub($arr[$key])這句看了半天沒看懂。下面是代碼
不太好解釋啊!
就拿$arr = array(1,2,'b',array(3,'c',array(4,5)));為例,給你逆推一下。
假設$arr = array(4,5);
$arr = doub($arr);實際就是$arr = doub(array(4,5));
doub(array(4,5)會返回array(8,10)這個應該沒喊圓問題吧,很基悄判礎的了。
最後再賦值給$arr,那麼$arr = array(8,10);
假設$arr = array(3,'c',array(4,5)));
因為$arr[2]=array(4,5);是個數組所以會去$arr[$key]=doub($arr[$key]);
其實實際就是$arr[2]=doub($arr[2]);再轉一下不就是$arr[2]=doub(array(4,5));
看前一個假設,那現在是不是就可以轉成$arr[2]=array(8,10);
所以最後的返回其實就是array(6,'c',array(8,10));
最後就是$arr = array(1,2,'b',array(3,'c',array(4,5)));
推演過程,參照上例
$arr[3]=array(3,'c',array(4,5));
$arr[$key]=doub($arr[$key]);
$arr[3]=doub(array(3,'c',array(4,5)));
$arr[3]=array(6,'c',array(8,10));
array(2,4,'b',array(6,'c',array(8,10)));
如果$arr更加復雜,其實無非就是以上過程不啟滲改斷重復重復再重復
哎,難得有此興致,吾已盡力,不知所雲。
『叄』 php遞歸的方法求和1+2+3+...+n
<?php
function add($n)
{
$result = 0;
for($i=1;$i<$n+1;$i++)
{
$result += $i;
}
return $result; 返回計算結果
}
echo add(5); //調用上面的函數
?>
『肆』 php寫函數根據子類(id)遞歸查找頂級父類(id)返回父類名字(表結構:idnamepid)
這個問題很胡槐盯簡單!你肯定得是褲和兩張表吧一張是table1(idnamepid)一張是table2(pidname)多表聯查:selecttable2.nameasp_name,pidasp_.pid=table2.pidwhereid='輸入你的子類ID'就可以明悔查詢了,望採納
『伍』 php遞歸,這個方法返回的值裡面,child欄位的值為空的,不知道為何,求大神詳解
<?php
$nodeArr=array(
"0"=>Array
(
"id"=>92,
"name"=>"show_page"歷禪,
"title"=>"測試",
"pid"悉敏=>13
),
"1"=>Array
(
"id"=>13,
"name"=>"iguess",
"title"=>"根目錄",
"pid"=>0
)
);
functionnode_merge($node,$pid=0){
$arr=array();
foreach($nodeas$key=>$v){
if($v['pid']==$pid){
$v['child']=node_merge($node,$v['id']);
肢陸塵$arr[]=$v;
}
}
return$arr;
}
$testArr=node_merge($nodeArr);
var_mp($testArr);
?>
列印的結果
『陸』 PHP多次遞歸返回值不一樣
因為$res是靜態變數,所以每次調用的結果是不同的。
『柒』 PHP遞歸調用導致內部伺服器錯誤問題,怎麼解決
我們在使用PHP遞歸時,會遇到各種各樣的問題,其中比亮核慶較令人苦惱的是有關PHP遞歸返回值時出現的問題。其實細細想想這是一個很簡單的問題。可就氏談是這個簡單的問題困擾了半個下午。問題出在遞歸函數的返回值上。
這是開始寫的:
代碼如下:
<?php
functiontest($i)
{
$i-=4;
if($i<3)
{
return$i;
}
else
{
test($i);
}
}
echotest(30);
?>
這段代碼看起來沒有問題,其實有else裡面是有問題的。在這里執行的test沒有返回值。所以雖然滿足條件$i<3時return$i整個函數還是不會返回值的。對上面的PHP遞歸返回值函數做如下修改:
代碼如下:
<?php
functiontest($i)
{
$i-=敬握4;
if($i<3)
{
return$i;
}
else
{
returntest($i);//增加return,讓函數返回值
}
}
echotest(30);
?>
以上代碼示例就是PHP遞歸返回值出現問題時的具體解決方法。
『捌』 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>
『玖』 PHP遞歸問題新的疑問
if(strlen($str)>0)
reverse_i(substr($str,1));//reverse_i('o')在這里調用reverse_i('')
/*reverse_i('o')調用槐畝reverse_i('灶明圓')之後
reverse_i('')返回到這里,下一句代碼是什麼應該不需要隱塌說了*/
echosubstr($str,0,1);
『拾』 PHP 遞歸函數返回值問題
朋友,你這個函數邏輯有問題
1.
$countsort_sql
=
"SELECT
*
FROM
`{$db_table}newssort`
WHERE
`newssort_pid`
=
'$pid'";
這個的欄位newssort_pid,如果第一次$pid可以查詢出結果,那麼下邊
while($countsort_row
=
mysql_fetch_assoc($countsort_result)){
countSort($countsort_row['newssort_pid']);
}
這里的參數$countsort_row['newssort_pid']就是你第一次輸入$pid,那麼如果按照正常思路就永遠循環
所以,我認為這里的countSort($countsort_row['newssort_pid']);中$countsort_row['newssort_pid']應該加以變化,比如+1
2.遞歸的判斷條件if($countsort_number
>
0)
這個$countsort_number
如果有一次查詢結果那麼它永遠是>0,這是不對裂液顫的。
修改函數如下,希望對你有所幫助。
function
countSort($pid)
{
global
$countsort_number;
$countsort_sql
=
"SELECT
*
FROM
`{$db_table}newssort`
WHERE
`newssort_pid`
=
'$pid'";
$countsort_result
=
mysql_query($countsort_sql)
or
die('數埋陪據庫查肆敗詢失敗,請與管理員聯系!');
$num=mysql_num_rows($countsort_result);
$countsort_number
+=$num;
if(
$num
>
0)
{
while($countsort_row
=
mysql_fetch_assoc($countsort_result)){
countSort(++$countsort_row['newssort_pid']);
}
mysql_free_result($countsort_result);
}
else
$abc=
$countsort_number;
}