嵌套循环。如何优化呢?

时间:2018-07-30 01:50:27

标签: php codeigniter optimization

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

根据用户的位置深度检查请求。 6是最低的,而1是最高的。因此基本上,最多将有5个人检查该请求。例如,我的深度为6,第1行将为5,第2行将为4,依此类推。系统将找到具有相同位置深度的人员,并且找到相同的部门组。第3行和第2行将决定是否将其发送给首席执行官(1),因此默认值仅保留到2。

我的一些数据库列 Some database columns

设计该行上方的人可以检查该请求,即使较低的行尚未对其进行检查,例如可能第1行尚未对其进行检查,因为他/她正在休假而第3行已经无法等待,因此他/她决定处理请求,因为它很重要。 现在,如果上面的行已经对其进行处理,那么下面的行将无法对其进行处理,因此只能查看它们。

现在是嵌套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是标记,如果该请求已在上一行中检查过。希望你们能给我有关如何优化代码的任何提示。

0 个答案:

没有答案