CleverCode在实际的工作中,会经常遇到对部门节点,求子部门的情况,其实这用算法中的宽度优先遍历算法就可以了。
数据结构如下:
宽度优先遍历的算法,是一级一级的往查找下找,比如需要找技术部门的所有的子部门,那么先让技术部门入队列。然后让技术部门出队列,让技术部门的孩子节点测试部和php部门入队列,保存到栈中;然后在让测试部门出队列,让测试部门的孩子节点测试一组和测试二组入队列,并保存到栈中。。。。直到队列为空,那么栈里面的结果就是所有的孩子节点。
php宽度优先遍历算法如下:
/**
* 获取下级部门ID
* @param unknown $departmentId
* @return multitype:
*/
public function getChildIds($departmentId)
{/*{{{*/
$ids = array();
if($departmentId < 1)
{
return $ids;
}
//从表中中获取所有数据;
$departments = $DataBase->queryAll('department');
if(false == is_array($departments) || count($departments) < 1)
{
return $ids;
}
//自己的孩子节点hash
$allFatherHash = array();
foreach($departments as $department)
{
if(false == isset($allFatherHash[$department['parentid']]))
{
$allFatherHash[$department['parentid']] = array();
}
$allFatherHash[$department['parentid']][] = $department;
}
//队列和栈
$queue = array($departmentId);
while(count($queue) > 0)
{
//出队列
$tmpId = array_shift($queue);
//没有孩子节点
if(false == isset($allFatherHash[$tmpId]))
{
continue;
}
$childs = $allFatherHash[$tmpId];
foreach($childs as $department)
{
//孩子入队列
$queue[] = $department['id'];
//孩子的入栈
$ids[] = $department['id'];
}
}
return $ids;
}/*}}}*/
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!