一款以ecshop無限分類為實例來介紹一下php中的遞歸函數返回值的問題介紹。
在 ecshop 二次開發中做產品分類索引時,要根據分類 id 取得所屬頂級分類 id 。第一個反應就是用遞歸遞出來,於是寫了遞歸函數如下:
代碼如下 復制代碼function getCatTopId($cat_id)
{
if ($cat_id)
{
$res = Array();
$sql = 'SELECT cat_id, parent_id'
. ' FROM ' . $GLOBALS['ecs']->table('category')
. ' WHERE cat_id = ' . $cat_id . ' AND is_show = 1';
$res = $GLOBALS['db']->getAll($sql);
if ($res[0]['parent_id'] > 0)
{
getCatTopId($res[0]['parent_id']);
}
else
{
return $res[0]['cat_id'];
}
}
else
{
return 1;
}
}
一測試程序,沒有得到返回值?檢查了很久都沒有發現錯誤,看來腦殼斷路了。今天問水神(一好心網友)時,他幫我解答出來了,修改如下:
代碼如下 復制代碼function getCatTopId($cat_id)
{
if ($cat_id)
{
$res = Array();
$sql = 'SELECT cat_id, parent_id'
. ' FROM ' . $GLOBALS['ecs']->table('category')
. ' WHERE cat_id = ' . $cat_id . ' AND is_show = 1';
$res = $GLOBALS['db']->getAll($sql);
if ($res[0]['parent_id'] > 0)
{
return getCatTopId($res[0]['parent_id']); // 修改處,多寫個 return ,讓函數返回值
}
else
{
return $res[0]['cat_id'];
} }
else
{
return 1;
}
}
函數寫在內部,就算返回了,也只是返回到內部的那個函數的位置,所以外面還有一層主函數,必須再 return 一下