我是新人,我感到迷失。这段代码是在无限循环吗?
我应该删除第 2-4 行吗?第 19 行“$_row['employee_manager_id'],”还重要吗?
关于我应该如何做到这一点有什么建议吗?谢谢。
function get_employees_by_hierarchy( $_employee_id = 0,$_depth = 0,$_org_array = array() ) {
if ( $this->org_depth < $_depth ) {
$this->org_depth = $_depth;
}
$_depth++;
$_query = "SELECT * FROM employees WHERE ";
if ( !$_employee_id ) {
$_query .= "employee_manager_id IS NULL OR employee_manager_id = 0";
}
else {
$_query .= "employee_manager_id = " . $this->dbh->quoteSmart( $_employee_id );
}
$_result = $this->query( $_query );
while ( $_row = $_result->fetchRow() ) {
$_row['depth'] = $_depth;
array_push( $_org_array, $_row );
$_org_array = $this->get_employees_by_hierarchy(
$_row['employee_manager_id'],
$_depth,
$_org_array
);
}
return $_org_array;
}
最佳答案
从外观上看:
它确实会无限循环。递归没有终止条件。您需要一个导致此情况的条件:
$_org_array = $this->get_employees_by_hierarchy( $_row['employee_manager_id'], $_深度, $_org_array );
不运行,或者至少将其分配给不是 get_employees_by_hierarchy 的对象。
修复此问题后,如果员工在某个时刻成为自己的经理,则会出现无限循环。
不可能说,“深度”还用在其他地方吗?此函数返回具有“深度”字段的
$_org_array
,但我们无法查看它是否已被使用。它当然不会破坏这段代码中的任何内容。- 如果没有看到示例数据,我会说,是的,这很重要。该代码使用自引用员工表进行递归,并使用经理的 ID 作为层次结构的下一级。
- 在分配
$_org_array
之前进行检查,检查经理的 ID 是否为空,如果发生这种情况,请执行如下操作:$_org_array = $this
。
关于PHP MYSQL 深度查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380357/