所以我的内存输出消息有问题......
我有一个带索引方法的类(控制器)......像这样:
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)中完成吗?
答案 0 :(得分:2)
您忘记在什么条件下指定该功能应该停止并返回。
修改强>
您的代码逻辑似乎有错误:
让我们说放在$this->CATS
中的数组$CAT
的第一个成员就是:
Array(
[id] => 1
[parent_id] => 0
...
)
对__set_all_sub_cats($CAT["id"])
的第一次通话将1
作为id
,0
作为父级。 $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
(您实际上从未将其删除),因此您最终会尝试不断为同一类别设置子类别。