//非递归获取所有后代分类
function get_offspring($pids,$list)
{
$npid = array();
$offspring = array();
$has_child = true;
while($has_child)
{
$has_child = false;
foreach($list as $lk => $lv)
{
if(in_array($lv['pid'],$pids))
{
$offspring[] = $lv;
$npid[] = $lv['cid'];
unset($list[$lk]);
$has_child = true;
}
}
$pids = $npid;
}
return $offspring;
}
//利用路径字段获取后辈分类
function get_offspring($pid)
{
$offspring = array();
$cats = $this->getList('cat_id,cat_name,parent_id,cat_path',array(),-1);
foreach($cats as $cv)
{
if(in_array($pid,explode(',',$cv['cat_path'])))
{
$offspring[] = $cv;
}
}
return $offspring;
}
//更新后辈分类路径
function update_offspring_path($pid,$ppath)
{
if($ppath == ',')
{
$ppath = '';
}
$offspring = $this->get_offspring($pid);
foreach($offspring as $ov)
{
$ov['cat_path'] = substr($ov['cat_path'],strlen($ov['cat_path'])-1);
$old_path = explode(',$ov['cat_path']);
foreach($old_path as $oldk => $oldv)
{
if($oldv == $pid)
{
break;
}
unset($old_path[$oldk]);
}
$new_path = $ppath.implode(',$old_path).',';
if(!$this->update(array('cat_path'=>$new_path),array('cat_id'=>$ov['cat_id'])))
{
return false;
}
}
return true;
}
//将列表整理为树形
function get_tree_list($pid,$arr,&$r)
{
foreach($arr as $k => $v)
{
if($v['parent_id'] == $pid)
{
if(isset($r[$pid]))//设置含有子类标记
{
$r[$pid]['has_child'] = 1;
}
$v['cat_path'] = trim($v['cat_path']);//计算深度
$path_str = substr($v['cat_path'],strlen($v['cat_path'])-1);
if($path_str == '')
{
$v['deep'] = 0;
}
else
{
$v['deep'] = count(explode(',$path_str));
}
$v['format'] = str_repeat(' ',6*$v['deep']);//计算缩进
$r[$v['cat_id']] = $v;//加入有序列表
unset($arr[$k]);//已加入 从无序列表中剔除
$this->get_tree_list($v['cat_id'],$r);
}
}
}