本帖最后由 ymkacscc20 于 2012-12-13 02:53:59 编辑

解决方案 »

  1.   

    已经可以了,不用优化了,很重要是相对于你的程序而言,是相对的很重要,并非绝对
    你这个function如果放入我的程式里,可能根本用不到,所以对我的程式而言上边所有的代码我都可以随意删掉,所以就没有重要性可言了.
      

  2.   

    这位高手,请问为什么不重要呢,按层次来search想要的employee,觉得还是挺重要的。
      

  3.   

    这段代码唯一可说重要的是 $this->dbh->quoteSmart( $_employee_id )
    不过从 quoteSmart 字面上看,只是提供一个转义功能。如果仅仅是转义,那么又显得多余了。因为数字是不需要转义的。如果是字符串的话,在构造出的查询串中又没有将其用引号括起如果 $this->dbh->quoteSmart( $_employee_id ) 返回的是 $_employee_id 的原值的话
    那么 "employee_manager_id = " . $this->dbh->quoteSmart( $_employee_id ) 之后将返回
    employee_manager_id=$_employee_id 的全部记录
    而下面递归调用时的 $_employee_id = $_row['employee_manager_id']
    由于 $_employee_id 并未发生改变,于是就将陷入死循环所以 $this->dbh->quoteSmart( $_employee_id ) 应该返回一个不同于 $_employee_id 的值
    因此他就是至关重要的了
      

  4.   

    加一下註釋就不難理解了
    function get_employees_by_hierarchy( $_employee_id = 0,$_depth = 0,$_org_array = array() ) {
        if ( $this->org_depth < $_depth ) {//如果类的属性org_depth值小于$_depth
            $this->org_depth = $_depth;//类的属性值$_depth等于$_depth
        }
        $_depth++;//累加
        $_query = "SELECT * FROM employees WHERE ";//创建查询语句
        if ( !$_employee_id ) {//如果变量的值是0或者false
            $_query .= "employee_manager_id IS NULL OR employee_manager_id = 0";//查询语句的值追加新内容
        }
           else { //如果变量的值是true或不为0
               $_query .= "employee_manager_id = " . $this->dbh->quoteSmart( $_employee_id );//查询语句的值追加新内容,quoteSmart这个方法做了什么,就要看方法的实现代码了
        }
           $_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);//不知道get_employees_by_hierarchy这个方法做了啥,不好说
          }
       return $_org_array;//返回值
    }