2015-04-29 20 views
1

我已經創建了一個數組,我需要顯示當前用戶的項目列表。每個項目由多個階段組成,每個階段可以分配多個KPI。cakePHP多維數組循環回到先前的推動

正如你所看到的階段被追加到陣列罰款和大多數的KPIs也是如此。

這是一個例外與KPI不是階段特定的。當我有這種類型的KPI應該分配給項目部分,因爲它跨越了多個階段。

如果ID爲空,那麼它是項目範圍的KPI,KPI由PSID分配給各個階段。

我遇到的問題是項目範圍內的KPI。他們重複,我需要每個KPI出現一次在數組中。

我試圖檢查先前推入的數組元素與當前推入的爲了檢查。

$i=0; 
    foreach($projects as $project){ 
     $projectStages = $this->ProjectStages->find('all', 
       array(
         'conditions' => array(
          'pid' => $project['Projects']['pid'] 
         ) 
       ) 
     ); 
     array_push($projects[$i], $projectStages); 


     $n=0; 
     foreach($projectStages as $stage){ 
      $projectKPIs = $this->ProjectKPIs->find('all', 
        array(
          'conditions' => array(
            'nPid' => $project['Projects']['pid'] 
          ) 
        ) 
      ); 

      foreach($projectKPIs as $projectKPI){ 
       if(empty($projectKPI['ProjectKPIs']['nPsid'])){ 

        $N = $n-1; 
        $curpkid = $projectKPI['ProjectKPIs']['pkid']; 

        if(isset($projects[$i]['Projects'][$N]['ProjectKPIs']['pkid'])){ 
         $prevpkid = $projects[$i]['Projects'][$N]['ProjectKPIs']['pkid']; 
        }else{ 
         $prevpkid = null; 
        } 

        if($curpkid != $prevpkid){ 
         echo 'cur: '.$curpkid.' - prev: '.$prevpkid; 
         array_push($projects[$i]['Projects'], $projectKPI); 
        } 

       }else if($projectKPI['ProjectKPIs']['nPsid'] == $stage['ProjectStages']['psid']){ 
        array_push($projects[$i][$i][$n]['ProjectStages'], $projectKPI); 
       } 

      } 



      $n++; 
     } 


     $i++; 
    } 

下面是我使用的代碼,目前我找回數組:

Array 
(
[0] => Array 
    (
     [Projects] => Array 
      (
       [pid] => 811 
       [name] => Kpi Project 
       [description] => This Project Has Kpis 
       [scheduledStartDate] => 2015-05-01 
       [scheduledEndDate] => 2015-06-01 
       [actualStartDate] => 
       [actualEndDate] => 
       [pmid] => 1137 
       [0] => Array 
        (
         [ProjectKPIs] => Array 
          (
           [pkid] => 37 
           [nPsid] => 
           [type] => 1 
           [start] => 2015-05-03 
           [end] => 2015-05-09 
           [nPid] => 811 
           [nKid] => 7 
          ) 

        ) 

       [1] => Array 
        (
         [ProjectKPIs] => Array 
          (
           [pkid] => 37 
           [nPsid] => 
           [type] => 1 
           [start] => 2015-05-03 
           [end] => 2015-05-09 
           [nPid] => 811 
           [nKid] => 7 
          ) 

        ) 

       [2] => Array 
        (
         [ProjectKPIs] => Array 
          (
           [pkid] => 37 
           [nPsid] => 
           [type] => 1 
           [start] => 2015-05-03 
           [end] => 2015-05-09 
           [nPid] => 811 
           [nKid] => 7 
          ) 

        ) 

       [3] => Array 
        (
         [ProjectKPIs] => Array 
          (
           [pkid] => 37 
           [nPsid] => 
           [type] => 1 
           [start] => 2015-05-03 
           [end] => 2015-05-09 
           [nPid] => 811 
           [nKid] => 7 
          ) 

        ) 

       [4] => Array 
        (
         [ProjectKPIs] => Array 
          (
           [pkid] => 37 
           [nPsid] => 
           [type] => 1 
           [start] => 2015-05-03 
           [end] => 2015-05-09 
           [nPid] => 811 
           [nKid] => 7 
          ) 

        ) 

      ) 

     [pm] => Array 
      (
       [first_name] => Mr 
       [last_name] => A 
      ) 

     [0] => Array 
      (
       [0] => Array 
        (
         [ProjectStages] => Array 
          (
           [psid] => 99 
           [pid] => 811 
           [stageID] => 1 
           [name] => 1 
           [description] => 1 
           [label] => 1 
           [actualStartDate] => 0000-00-00 
           [scheduledStartDate] => 2015-05-01 
           [actualEndDate] => 0000-00-00 
           [scheduledEndDate] => 2015-05-08 
           [prevStage] => n 
           [keyStage] => n 
           [0] => Array 
            (
             [ProjectKPIs] => Array 
              (
               [pkid] => 32 
               [nPsid] => 99 
               [type] => 0 
               [start] => 
               [end] => 
               [nPid] => 811 
               [nKid] => 2 
              ) 

            ) 

          ) 

        ) 

       [1] => Array 
        (
         [ProjectStages] => Array 
          (
           [psid] => 100 
           [pid] => 811 
           [stageID] => 2 
           [name] => 2 
           [description] => 2 
           [label] => 2 
           [actualStartDate] => 0000-00-00 
           [scheduledStartDate] => 2015-05-08 
           [actualEndDate] => 0000-00-00 
           [scheduledEndDate] => 2015-05-15 
           [prevStage] => n 
           [keyStage] => n 
           [0] => Array 
            (
             [ProjectKPIs] => Array 
              (
               [pkid] => 33 
               [nPsid] => 100 
               [type] => 0 
               [start] => 
               [end] => 
               [nPid] => 811 
               [nKid] => 4 
              ) 

            ) 

          ) 

        ) 

       [2] => Array 
        (
         [ProjectStages] => Array 
          (
           [psid] => 101 
           [pid] => 811 
           [stageID] => 3 
           [name] => 3 
           [description] => 3 
           [label] => 3 
           [actualStartDate] => 0000-00-00 
           [scheduledStartDate] => 2015-05-15 
           [actualEndDate] => 0000-00-00 
           [scheduledEndDate] => 2015-05-22 
           [prevStage] => n 
           [keyStage] => n 
           [0] => Array 
            (
             [ProjectKPIs] => Array 
              (
               [pkid] => 34 
               [nPsid] => 101 
               [type] => 0 
               [start] => 
               [end] => 
               [nPid] => 811 
               [nKid] => 5 
              ) 

            ) 

          ) 

        ) 

       [3] => Array 
        (
         [ProjectStages] => Array 
          (
           [psid] => 102 
           [pid] => 811 
           [stageID] => 4 
           [name] => 4 
           [description] => 4 
           [label] => 4 
           [actualStartDate] => 0000-00-00 
           [scheduledStartDate] => 2015-05-22 
           [actualEndDate] => 0000-00-00 
           [scheduledEndDate] => 2015-05-29 
           [prevStage] => n 
           [keyStage] => n 
           [0] => Array 
            (
             [ProjectKPIs] => Array 
              (
               [pkid] => 35 
               [nPsid] => 102 
               [type] => 0 
               [start] => 
               [end] => 
               [nPid] => 811 
               [nKid] => 6 
              ) 

            ) 

          ) 

        ) 

       [4] => Array 
        (
         [ProjectStages] => Array 
          (
           [psid] => 103 
           [pid] => 811 
           [stageID] => 5 
           [name] => 5 
           [description] => 5 
           [label] => 5 
           [actualStartDate] => 0000-00-00 
           [scheduledStartDate] => 2015-05-29 
           [actualEndDate] => 0000-00-00 
           [scheduledEndDate] => 2015-06-01 
           [prevStage] => n 
           [keyStage] => n 
           [0] => Array 
            (
             [ProjectKPIs] => Array 
              (
               [pkid] => 36 
               [nPsid] => 103 
               [type] => 0 
               [start] => 
               [end] => 
               [nPid] => 811 
               [nKid] => 8 
              ) 

            ) 

          ) 

        ) 

      ) 

    ) 

[1] => Array 
    (
     [Projects] => Array 
      (
       [pid] => 572 
       [name] => Sgh 
       [description] => Dfgh 
       [scheduledStartDate] => 2015-04-01 
       [scheduledEndDate] => 2015-05-01 
       [actualStartDate] => 
       [actualEndDate] => 
       [pmid] => 3304 
      ) 

     [pm] => Array 
      (
       [first_name] => Mr 
       [last_name] => Brown 
      ) 

     [0] => Array 
      (
      ) 

    ) 

) 

回答

1

看來您檢索完全相同的數據庫結果多次。我在此代碼塊看發現:

foreach($projectStages as $stage){ 
      $projectKPIs = $this->ProjectKPIs->find('all', 
        array(
          'conditions' => array(
            'nPid' => $project['Projects']['pid'] 
          ) 
        ) 
      ); 

      // ... 
    } 

它看起來對我說,你會得到相同的結果集爲$projectKPIs上的foreach $projectStages的每一次迭代,因爲找到ProjectKPIs使用項目ID,與當前的$stage無關。

對於每一個階段都非常有效,然後再次遍歷所有相同的KPI,導致您的邏輯錯亂地嘗試避免重複。

也許這可以通過重構你的foreach循環來簡化。我會拋棄外部foreach($projectStages as $stage),然後遍歷所有KPI只有一次。然後,在該循環中,只有當您需要針對$stage['ProjectStages']['psid']進行測試時,纔會在每個階段迭代,而這在實際上可能是不必要的。

+0

謝謝。這使我有權得到答案。我只是將項目KPIs查詢與psid進行匹配,然後對於項目範圍的KPI,我運行了一個單獨的查詢來匹配psid,其中null – jampez77