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

时间:2015-04-29 15:07:37

标签: php arrays cakephp multidimensional-array

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

正如您所看到的那样,这些阶段会附加到数组中,并且大部分都是KPI。

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

KID由PSID分配给阶段,如果id为null,则它是项目范围的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
            (
            )

    )

)

1 个答案:

答案 0 :(得分:1)

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

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

            // ...
    }

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

对于每个阶段都是如此有效,然后再次遍历所有相同的KPI,导致您的逻辑变得复杂,试图避免重复。

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