php多重循環如何提高執行效率


優化基於以下幾個原則:

1、盡量以小結果集驅動大結果集(和mysql中join類似);

2、盡量少在循環中執行sql操作,如果一定要執行sql,盡量批量執行;

3、盡量減少邏輯性代碼和調用外部方法,如必要,盡量在在小結果集上處理的;

4、實際應用中發現循環嵌套使用的數據大部分一樣,只有小部分不同,果斷提取,外部處理;

 

場景1:

 1 <?php
 2 
 3 $data = array();
 4 //參數
 5 
 6 $kid = []; //數組長度大於300
 7 $dataarray = []; //數組長度大於50
 8 
 9 foreach ($dataarray as $k=>$v){
10 
11     $starttime = 0;
12     $endtime = 0;
13     $timearr[$starttime.$endtime]['rid'][] = $k;
14     $data = array();
15     $i=0;
16     foreach ($kid as $kk){
17 
18         $data[$i]['k'] = $kk;
19         $data[$i]['m'] = $kk;
20         $data[$i]['n'] = $kk;
21         //必要的賦值操作
22         //...
23 
24         //各種邏輯判斷,並且賦值使用的是上一級嵌套中的變量
25         if (!empty($v['a']))
26             $data[$i]['a'] =  $v['a'];
27         if (!empty($v['a']))
28             $data[$i]['a'] = $v['a'].",".$v['a'];
29 
30         if (!empty($v['a']))
31             $data[$i]['a'] =  $v['a'];
32         if (!empty($v['a']))
33             $data[$i]['a'] = $v['a'].",".$v['a'];
34 
35         if (!empty($v['a']))
36             $data[$i]['a'] =  $v['a'];
37         if (!empty($v['a']))
38             $data[$i]['a'] = $v['a'].",".$v['a'];
39         $i++;
40     }
41     //插入數據
42     $allin = $this->model->table('pp')->addALL($data);
43 }
44 exit;

 

以上代碼實際使用中執行時長大概 20s

 

優化后如下,把必要的邏輯操作,又涉及到上一層循環變量,提取出來,不要放在大結果集中處理,執行時長大概 3秒

<?php

//參數

$kid = [];

$dataarray = [];


foreach ($dataarray as $k=>$v){

    if (!empty($v['a']))
       $a =  $v['a'];
    if (!empty($v['a']))
        $a = $v['a'].",".$v['a'];

    if (!empty($v['a']))
        $a =  $v['a'];
    if (!empty($v['a']))
        $a = $v['a'].",".$v['a'];

    if (!empty($v['a']))
        $a =  $v['a'];
    if (!empty($v['a']))
        $a = $v['a'].",".$v['a'];

    $data = [];
    foreach ($kid as $mm=>$kk){
        $data[$mm]['k'] = $kk;
        $data[$mm]['m'] = $kk;
        $data[$mm]['n'] = $kk;
        //必要的賦值操作
        //...

        $data[$mm]['a'] =  $a;
        $data[$mm]['a'] =  $a;
        $data[$mm]['a'] =  $a;
        $data[$mm]['a'] =  $a;
    }
    //插入數據
    $allin = $this->model->table('pp')->addALL($data);

}

exit;

 

 

場景2:

優化前,執行時間80秒,其中循環時間 62,數據庫操作時間 18秒

 1 <?php
 2 
 3 
 4 //參數
 5 
 6 $kid = [];//長度大於300
 7 
 8 
 9 
10 $dataarray = []; //長度大於50
11 $stimearr = [];
12 $etimearr = [];
13 
14 $countTime = count($stimearr); //長度大於 5
15 
16 for ($a = 0;$a < $countTime;$a++) { //注意,后面兩層嵌套中,除了時間不一樣,其他完全一樣
17 
18     $stime = strtotime($stimearr[$a]);
19     $etime = strtotime($etimearr[$a]);
20 
21 
22     foreach ($kid as $kk) { // 大結果集
23         $data = array();
24         $i = 0;
25         foreach ($dataarray as $k => $v) { //小結果集合
26 
27             $data[$i]['a'] = $kk;
28             $data[$i]['a'] = intval($k);
29             $data[$i]['a'] = $v['a'];
30             $data[$i]['a'] = $v['a'];
31             $data[$i]['stime'] = $stime;
32             $data[$i]['etime'] = $etime;
33 
34             if ($a) {
35                 $data[$i]['a'] = $k;
36                 $data[$i]['a'] = $k;
37             }
38             if ($a) {
39                 $data[$i]['a'] = $k;
40                 $data[$i]['a'] = $k;
41             }
42             $i++;
43         }
44         //插入數據
45         $allin = $this->model->table('pp')->addAll($data);
46     }
47 }
48 exit;

 

優化后

<?php


//參數

$kid = [];//長度大於300



$dataarray = []; //長度大於50
$stimearr = [];
$etimearr = [];

$countTime = count($stimearr); //長度大於 5


$i = 0;
$data = [];
//提取數據保存
foreach ($dataarray as $k=>$v){ //小結果集

    $a = 'xxx'; //邏輯處理
    $a = 'xxx'; //邏輯處理
    $a = 'xxx'; //邏輯處理
    $a = 'xxx'; //邏輯處理

    foreach ($kid as $mm=>$kk){ //大結果集合
        $data[$i][$mm]['a'] = $kk;
        $data[$i][$mm]['a'] = intval($k);
        $data[$i][$mm]['a'] = $v['a'];
        $data[$i][$mm]['a'] = $v['a'];
        
        $data[$i][$mm]['a'] = $a;
        $data[$i][$mm]['a'] = $a;
        $data[$i][$mm]['a'] = $a;
        
    }
    $i ++;
}

for ($b = 0;$b < $countTime;$a++) {
    $stime = strtotime($stimearr[$b]);
    $etime = strtotime($etimearr[$b]);
    foreach ($data as $k=>$v){
        foreach ($v as $kk=>$vv){
            $data[$k][$kk] = array_merge($data[$k][$kk],['starttime'=>$stime,'endtime'=>$etime]);
        }
        //插入數據
        $allin = $this->model->table('pp')->addALL($data[$k]);
    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM