鍍金池/ 問(wèn)答/PHP  C  C++/ PHP遞歸無(wú)限分類內(nèi)存溢出

PHP遞歸無(wú)限分類內(nèi)存溢出

Allowed memory size of 33554432 bytes exhausted ..

之前一直用一直沒(méi)出現(xiàn)問(wèn)題,現(xiàn)在再用就報(bào)錯(cuò)了。之前是根據(jù)int的id來(lái)遞歸,現(xiàn)在根據(jù)varchar的用戶名遞歸。并且現(xiàn)在才不到10條數(shù)據(jù)。是不是跟字段類型有關(guān)?

遞歸代碼

function getTree($list, $parent_id, $level=0) {

    static $tree = array();
 
    foreach($list as $row) {
 
      if($row['pid'] == $parent_id) {

        $row['level'] = $level;
        
        $tree[] = $row;

        getTree($list, $row['id'], $level+1);
      }
   }
   return $tree;
}
回答
編輯回答
練命

1、PHP對(duì)遞歸是有限制的,遞歸次數(shù)過(guò)多就會(huì)出現(xiàn)溢出報(bào)錯(cuò)。
2、在理論上,所有的遞歸都可以用循環(huán)替代。
3、生成HTML樹(shù)的難點(diǎn)在于html的閉合標(biāo)簽如:</ul>。

可以參考:PHP無(wú)限級(jí)分類的實(shí)現(xiàn)(不使用遞歸) http://www.cnblogs.com/rainma...

2017年7月31日 05:35
編輯回答
冷眸

可能原因:遞歸沒(méi)有返回,從而無(wú)限遞歸,最終造成函數(shù)的調(diào)用棧溢出。

遞歸的兩個(gè)基本條件:

  • 遞歸的退出條件。

  • 遞推過(guò)程。

建議樓主貼出所傳入的參數(shù),或者自己在每次遞歸調(diào)用時(shí),打印一下所傳入的參數(shù),看是不是因?yàn)閿?shù)據(jù)結(jié)構(gòu)問(wèn)題造成了循環(huán)遞歸。

2017年3月24日 08:02
編輯回答
別瞎鬧

應(yīng)該是你的數(shù)據(jù)出現(xiàn)了問(wèn)題,
也就是:
比如:
$list=array(
array('id'=>1,"name"=>"父類","pid"=>3),
array("id"=>2,"name"=>"子類","pid"=>1),
array("id"=>3,"name"=>"孫類","pid"=>2),
);

這樣就會(huì)變成子子孫孫無(wú)窮盡也?。。。?!

2017年3月6日 02:26
編輯回答
糖豆豆

我跟一樓一樣的看法,因?yàn)槟阌胕nt類型id來(lái)遞歸,可能這個(gè)id是主鍵他不會(huì)重復(fù),他是唯一的,得到了一批子孫。但是你用varchar可能某次遞歸的時(shí)候的到了兩批,最可怕的是這兩批中的數(shù)據(jù)互相有關(guān)系,導(dǎo)致你無(wú)限遞歸,內(nèi)存溢出,然后over了。

2017年3月17日 20:02