Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单的PHP递归-为什么内存不足?_Php_Memory Management - Fatal编程技术网

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

简单的PHP递归-为什么内存不足?,php,memory-management,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 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);
        }
    }
}
foreach($this->CATS as $C)
其中$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。。。我得到:

致命错误:第186行的D:\root\app\my.controller.php中允许的内存大小134217728字节已用完(尝试分配35字节)

我的目标是得到一个父猫的列表,这个列表将有另一个叫做is_的布尔型集合。。。当所有子项(和自身)的trader_category_id设置为0以外的值时,is_set值为TRUE

所以这就是为什么我需要为每只母猫找到所有的孩子


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

您忘了指定函数在什么条件下停止并返回

编辑

您的代码逻辑中有一个错误,似乎是:

假设放置在
$CAT
中的数组
$this->CATS
的第一个成员是:

Array(
      [id] => 1
      [parent_id] => 0
      ...
     )
第一次调用
\u set\u all\u sub\u CAT($CAT[“id”])
1
作为
id
0
作为父项
$this
引用原始对象(我假设这是一个id等于
0
的对象)

然后
\uu set\u all\u sub\u cats()
有这样一行:

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);
        }
    }
}
foreach($this->CATS as $C)
因此,基本上您要再次检查
$this->CATS
数组。但您从未创建过类的另一个实例。您仍在使用原始对象

编辑

另一个答案解释得更好

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

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

问题似乎在那里<代码>$CAT仍在
$this->CATS
中(您从未实际删除过它),因此您会不断尝试为同一类别设置子类别。

Hm。。。别明白你的意思$这个->猫有所有的猫(所有的树)…所有的数据我试图设置$this->subs与所有当前的后代…只有idshm,我没有。只有在循环所有(预设)$this->CATS后,该功能才会停止。因此,我在一个类范围内,所以目标不是从函数返回值,而是设置一个类属性($this->subs),对不起。。。一旦我得到了我需要的答案,我就不会费心去“接受”答案。。。我真丢脸!我马上就做;)谢谢你们的时间,伙计们!陛下我再次检查了我的问题,并且接受是正确的。。。可悲的是,我从未从那些不被接受的问题中得到有用的答案。但是看起来你有很多时间来检查这些数字!有益于you@Tomalak“施压”?这只是批评,别高估了。DS_web_开发者,抱歉,如果这是“有害的”,但当用户甚至不花一秒钟的时间来回答“谢谢”时,这真的很烦人。有时写一个答案需要30-50分钟(尤其是代码)。@OZ_389;:你又在做了。请停下来。当他们解决最初的问题时,答案应该被接受(OP已经表示,他的其他问题还没有出现这种情况),而不是满足像你这样的人似乎很享受的对认可的渴望。@Tomalak Geret'kal你认为你足够了解我来写“像你这样的人”吗?我讨厌这个短语。即使在这些评论中,你也无法理解我,所以不要妄下判断。若你们从来并没有浪费时间去回答那个些根本并没有被评论过的问题,你们就不会理解我。