我正在处理业务目录,需要在类别列表中显示类别的递归父级。
我正在使用以下功能:
public function get_recursive_parents($category_id){
$categories = array();
$res = $this->db->from('categories')->where('cat_id',$category_id)->get()->row_array();
$cat_id = $res['parent_id'];
$categories[] = $res;
while($cat_id){
$res = $this->db->from('categories')->where('cat_id',$cat_id)->get()->row_array();
$categories[] = $res;
$cat_id = $res['parent_id'];
}
return $categories;
}
我正在使用此功能,因为它在管理网站上,在管理网站上有点慢也可以,并且管理员将只有一个所以我可以给它更多的内存。但我认为限制内存超过300M为一个电话太多了,仍然得到这个:
Fatal error: Allowed memory size of 367001600 bytes exhausted (tried to allocate 72 bytes) in /var/www/usmanproject/salesfinder/system/database/DB_active_rec.php on line 2007
那么有什么方法可以优化以上功能?或者我需要做一些特定的索引或算法优化,或任何其他可能的方式?或者我只是停止显示所有父母和类别的超级父母(即客户要求查看层次结构)?或者需要增加内存,因为我已经在一个目录上工作,而且在管理站点也很慢,所以我猜他们只是在使用更多内存?
任何建议将不胜感激。
这是表模式,它有parent_id,因此它作为递归关系工作。
CREATE TABLE IF NOT EXISTS `categories` (
`cat_id` int(11) NOT NULL AUTO_INCREMENT,
`cat_name` varchar(255) DEFAULT NULL,
`cat_title` varchar(255) DEFAULT NULL,
`cat_desc` varchar(255) DEFAULT NULL,
`cat_text` text,
`parent_id` int(11) NOT NULL,
`cat_img` varchar(255) DEFAULT NULL,
`sort_id` int(11) NOT NULL DEFAULT '1',
`last_level` tinyint(4) NOT NULL,
PRIMARY KEY (`cat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=221 ;
答案 0 :(得分:0)
尝试使用以下代码
public function get_recursive_parents($category_id,$categories=array())
{
if($category_id!="")
{
$new_ar1=array();
$fe = $this->db->from('categories')->where('cat_id',$category_id)->get()->row_array();
array_push($new_ar1,$fe["parent_id"]);
return $new_ar1;
}
else
{
$res = $this->db->from('categories')->get()->row_array();
array_push($categories,$res['parent_id']);
$categories[$res['parent_id']]=array();
array_push($categories[$res['cat_id']],get_recursive_parents($res['parent_id'],$categories));
}
return $new_ar;
}
调用函数
get_recursive_parents($category_id);
希望它会帮助你
答案 1 :(得分:0)
问题已解决,实际上有一条记录parent_id
指向自己的cat_id
主键。所以这指向了自己,在这种情况下递归根本就没有结束。我使用while循环,在这种情况下变得无限。
但是在调试过程中,我发现这篇文章很有帮助, http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 它提供了更好的方法来处理同样的事情。在我的场景中,自我加入很有用,如本文所述。