开发者

Simple PHP recursion - why am I getting out of memory?

开发者 https://www.devze.com 2023-04-03 21:48 出处:网络
So I am having a problem with memory out message... I have a class (controller) with index method...something like this:

So I am having a problem with memory out message...

I have a class (controller) with index method...something like this:

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);
        }
    }
}

where $this->CATS is an array fetched from DB with around only 3000 rows...

each row looks something like this

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
)

So not a big deal...and I've set php_ini to use 128M ... and I am getting:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes) in D:\root\app\my.controller.php on line 186

my goal is to get the list of parent cats that will have another firled called is_set of boolean type... the is_set value is TRUE when ALL of the children (and self) have trader_category_id set to other than 0...

so that's why I need to get all of the children for each parent cat...

CAN it be done in db query (mysql) alone?


You forgot to specify under what conditions should the function stop and return.

EDIT

You have an error in your code logic it seems:

Lets say the first member of the array $this->CATS that was placed in $CAT is this:

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

The very first call to __set_all_sub_cats($CAT["id"]) will have 1 as the id and 0 as the parent. $this refers to the original object (I assume this is the one with id equal to 0).

Then __set_all_sub_cats() has a line like this:

foreach($this->CATS as $C)

So basically you are going over the $this->CATS array once again. But you never created another instance of your class. You are still using the original object

EDIT

The other answer explains it better


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

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

Problem seems to be there. $CAT is still in $this->CATS (you never actually remove it) so you end up trying to set the sub categories for the same category constantly.

0

精彩评论

暂无评论...
验证码 换一张
取 消