2011-09-09 50 views
1

所以我有記憶了消息一個問題...簡單的PHP遞歸 - 爲什麼我的內存不足?

我有一個類(控制器)與指數法...是這樣的:

function index($parent=0){ 
    $this->__set_all_cats(); 
    foreach($this->CATS as $CAT){ 
     ... 

     if($CAT["parent_id"] == $parent) $this->__set_all_sub_cats($CAT["id"]); 
     ... 
    } 
} 



function __set_all_cats(){ 
    $CATS = ...get array from db 
    foreach($CATS as $CAT){ 
     $this->CATS[$CAT["id"]] = $CAT; 
    } 
} 

function __set_all_sub_cats($cat_id, $start = 1){ 
    if($start) $this->subs=array(); 
    $this->subs[] = $cat_id; 

    $CAT = $this->CATS[$cat_id]; 
    $parent = $CAT["parent_id"]; 

    foreach($this->CATS as $C){ 
     if($C["parent_id"] == $parent){ 
      $this->__set_all_sub_cats($C["id"], 0); 
     } 
    } 
} 

其中$這個 - > CATS是從數據庫獲取與周圍只有3000行的數組...

每一行看起來是這樣的

Array(
    [id] => 18674 
    [importer_id] => 6 
    [parent_id] => 0 
    [category_id] => 1 
    [category_name] => Category name 
    [category_slug] => category0slug 
    [private_category_id] => 0 
    [trader_category_id] => 951 
) 

所以沒什麼大不了的......我已經設置php_ini使用128M ...和我得到:

致命錯誤:用盡134217728個字節允許存儲器大小(試圖分配35個字節)d:\根\應用\ my.controller.php在線

我的目標是獲得,將有另一firled布爾類型的所謂is_set父貓列表...的is_set值爲TRUE時,所有的孩子們(和個體經營)將trader_category_id設置爲0以外...

所以這就是爲什麼我需要讓所有的孩子每個父母的貓......

可以在數據庫中查詢(MySQL的)單獨做了什麼?

+0

我很抱歉...一旦我得到我需要的東西,我從來不會感到「接受」答案......對我感到羞恥!我會馬上去做;)謝謝你的時間! –

+1

嗯...我再次回顧我的問題,接受是正確的......可悲的是,我從來沒有從那些沒有接受的問題中得到有用的答案。但是看起來你很抱歉檢查這個數字!對你有好處 –

+0

@Tomalak Geret'kal「壓力」?這只是評論家,不要高估它。 DS_web_developer,抱歉,如果它是「有害的」,但是當用戶甚至不花費1秒的時間說「謝謝」答案時,它真的很煩人。有時需要30-50分鐘才能寫出答案(特別是在代碼中)。 –

回答

2

你忘了指定函數在什麼條件下應該停止並返回。

編輯

你在你的代碼中的邏輯錯誤似乎:

比方說,它被放置在$CAT陣列$this->CATS的第一個成員是:

Array(
     [id] => 1 
     [parent_id] => 0 
     ... 
    ) 

__set_all_sub_cats($CAT["id"])的第一個電話將以1作爲id0作爲父母。 $this是指原始對象(我假設這是一個id等於0)。

然後__set_all_sub_cats()有這樣一行:

foreach($this->CATS as $C) 

所以基本上你要在$this->CATS陣列一次。但是你從來沒有創建過類的另一個實例。你還在使用原始的對象

編輯

對方回答解釋了它更好的

+0

嗯,我沒有。 該功能應該在所有(預設)$ this-> CATS循環後停止。因此,我處於類範圍內,所以我們的目標不是從函數返回值,而是設置類屬性($ this-> subs) –

0
$CAT = $this->CATS[$cat_id]; 
$parent = $CAT["parent_id"]; 

foreach($this->CATS as $C){ 
    if($C["parent_id"] == $parent){ 

問題似乎是在那裏。$CAT仍然在$this->CATS(你永遠不會刪除它),所以你最終試圖不斷設置相同類別的子類別。

+0

嗯...不明白你的觀點。 $ this-> CATS有所有的貓(所有的樹)...與所有的數據 我想設置$ this-> subs與所有CURRENT後代....只有ID –