简单的PHP递归 - 为什么我的内存不足?

时间:2011-09-09 08:15:14

标签: php memory-management

所以我的内存输出消息有问题......

我有一个带索引方法的类(控制器)......像这样:

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

其中$ this-> CATS是从DB获取的数组,只有大约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 ......我得到了:

  

致命错误:在行 D:\ root \ app \ my.controller.php 中,允许的内存大小为134217728个字节(试图分配35个字节) b> 186

我的目标是获取另一个名为is_set of boolean type的父猫列表...当所有子项(和self)将trader_category_id设置为0以外时,is_set值为TRUE ...

所以这就是为什么我需要为每只父猫获得所有孩子...

可以单独在db query(mysql)中完成吗?

2 个答案:

答案 0 :(得分:2)

您忘记在什么条件下指定该功能应该停止并返回。

修改

您的代码逻辑似乎有错误:

让我们说放在$this->CATS中的数组$CAT的第一个成员就是:

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数组。但是你从未创建过你班级的另一个实例。您仍在使用原始对象

编辑

另一个答案更好地解释了

答案 1 :(得分:0)

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

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

似乎存在问题。 $CAT仍然在$this->CATS(您实际上从未将其删除),因此您最终会尝试不断为同一类别设置子类别。