首页 > 解决方案 > 我的嵌套 for 循环慢吗?

问题描述

我目前正在使用PHP (Codeigniter)开发审批系统,我有这种方法可以根据您的部门组和职位深度获取所有请求。

请求的检查基于用户的位置深度。6 为最低,1 为最高。所以基本上最多有5个人来检查请求。例如,我的深度为 6,line1 为 5,line2 为 4,依此类推。系统会找到具有类似职位深度和相同部门组的人员。第 3 行和第 2 行将决定是否将其发送给 ceo (1),因此默认仅到 2。

我的一些数据库列 一些数据库列

它的设计是让线上的人可以检查请求,即使下面的线还没有检查它,例如可能 line1 还没有检查它,因为他/她正在度假,而 line3 不能等待,所以他/她决定处理请求,因为它很重要。现在如果上面的行已经处理了它,下面的行就不能再处理它了,所以他们只能被允许查看它。

现在这里是我的嵌套for循环代码,用于检查我所说的所有这些内容。人们说嵌套for循环,尤其是像我这样多的循环不是一个好习惯。当涉及到大数据时,我的循环会出现问题吗?for如果是这样,我如何在不为此更改数据库的情况下更改我的代码?

这是我的模特

public function getRequestsToProcess($i,$depth,$departmentGroup)
{
    $this->db->select('*, ns_request_info.idx as request_idx, ns_staff_info.idx as staff_idx');    
    $this->db->from('ns_request_info');
    $this->db->join('ns_staff_info', 'ns_request_info.requested_by_idx = ns_staff_info.member_idx');
    $this->db->where('line'.$i.'', $depth);
    $this->db->where('line'.$i.'_action', 'PENDING');
    if($departmentGroup!='HIGHER TIER'){ $this->db->where('ns_staff_info.department_group', $departmentGroup); }
    $this->db->where('status', 'PENDING');
    $this->db->or_where('status', 'ONGOING');
    $this->db->where('line'.$i.'', $depth);
    $this->db->where('line'.$i.'_action', 'PENDING');
    if($departmentGroup!='HIGHER TIER'){ $this->db->where('ns_staff_info.department_group', $departmentGroup); }
    $query = $this->db->get();
    return $query->result_array();
}

这是我的嵌套for循环方法

public function process()
{
    $data = new stdClass;
    $data->param_menu = 'request';

    $staffInfo = $this->staffinfo_model->selectItem(array('member_idx'=>$this->session->userdata('member_index')));

    for ( $i=1 ; $i<=5 ; $i++) {
        /*get lines with user depth and if same department group*/
        ${"line" . $i} = $this->staffrequisition_model->getRequestsToProcess($i,$staffInfo->position_depth,$staffInfo->department_group);

        for ($x = 0 ; $x < count(${"line" . $i}) ; $x++) {
            $counter = 0;
            for ($y = $i + 1 ; $y <=5 ; $y++) {
                if (${"line" . $i}[$x]['line'.$y.'_action']!=='PENDING' && ${"line" . $i}[$x]['line'.$y.'_action']!=='') {
                    $counter++;
                    break; 
                } 
            }
            if ($counter > 0) {
                ${"line" . $i}[$x]['is_checked'] = 1;
            } else {
                ${"line" . $i}[$x]['is_checked'] = 0;
            }
        }
    }

    $data->param_requests = array_merge($line1, $line2, $line3, $line4, $line5);

    $this->load->view('dashboard/staff/process_view', $data);
}

is_checked如果请求已经在上面的行中检查,则现在是标记。我希望你们能给我任何关于如何优化我的代码的提示。

标签: phpcodeigniteroptimization

解决方案


推荐阅读