cakePHP 多维数组循环返回上一次推送

cakePHP multidimensional array loop back to previous push

我创建了一个数组,我需要用它来显示当前用户的项目列表。每个项目由阶段组成,每个阶段可以分配多个 KPI。

如您所见,阶段已很好地附加到数组中,并且在大多数情况下,KPI 也是如此。

例外情况是不特定于阶段的 KPI。当我有这种类型的 KPI 时,应该分配给项目部分,因为它跨越多个阶段。

KPI 由 PSID 分配给阶段,如果 id 为空则它是项目范围的 KPI。

我遇到的问题是项目范围的 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
            (
            )

    )

)

您似乎多次检索完全相同的数据库结果。我正在查看此代码块中的查找:

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

            // ...
    }

在我看来,您将在 foreach $projectStages 的每次迭代中获得 $projectKPIs 的相同结果集,因为 ProjectKPIs 的查找使用的是项目 ID与当前 $stage 无关。

对于每个阶段都非常有效,然后您再次循环所有相同的 KPI,导致您的逻辑变得复杂,试图避免重复。

也许这可以通过重构 foreach 循环来简化。我会放弃外部 foreach($projectStages as $stage),然后只对所有 KPI 进行一次迭代。然后在该循​​环内迭代每个阶段,仅当您需要针对 $stage['ProjectStages']['psid'] 进行测试时,这实际上在这一点上可能是不必要的。