Php 获取索引行的子数组列的和

Php 获取索引行的子数组列的和,php,arrays,Php,Arrays,我有一系列客户/人员,他们拥有与该客户相关的项目子阵列。项目分为两种类型:“typeJob”或“typePipeline”。我需要按客户对projects子数组中各个列的值进行求和(特别是第5、6、7列-表示第1个月、第2个月和第3个月的收入) 我尝试了各种可能的方法,包括下面的方法,但我似乎总是以测试整个数组而不是每一行是否满足条件为结束,或者如果我选择了for each循环生成错误的方式,因为要么是数组/单个值不匹配,要么是条件没有任何作用 这是我最近试过的。它的工作原理是检查数组中是否有“

我有一系列客户/人员,他们拥有与该客户相关的项目子阵列。项目分为两种类型:“typeJob”或“typePipeline”。我需要按客户对projects子数组中各个列的值进行求和(特别是第5、6、7列-表示第1个月、第2个月和第3个月的收入)

我尝试了各种可能的方法,包括下面的方法,但我似乎总是以测试整个数组而不是每一行是否满足条件为结束,或者如果我选择了for each循环生成错误的方式,因为要么是数组/单个值不匹配,要么是条件没有任何作用

这是我最近试过的。它的工作原理是检查数组中是否有“typeJob”,但如果为客户的任何项目找到了“typeJob”,则对所有行(即使是没有“typeJob”的行)求和。我想排除找不到“typeJob”的行

foreach ($arrays as $row) {
$indexJob = array_search('typeJob', array_column($row['projects'],0));
  if ($indexJob !== false) {
  $job_total1[$row['Client']] = array_sum(array_column($row['projects'],5));
  $job_total2[$row['Client']] = array_sum(array_column($row['projects'],6));
  $job_total3[$row['Client']] = array_sum(array_column($row['projects'],7));
  }
}
这是数组:

(
    [331] => Array
        (
            [KeyAccountID] => 1234
            [KeyAccountName] => John Lennon
            [ClientID] => 9999
            [Client] => BBC
            [projects] => Array
                (
                    [0] => Array
                        (
                            [0] => typePipeline
                            [1] => 915
                            [2] => Zyxeldy
                            [3] =>  
                            [4] =>  
                            [5] => 15000
                            [6] => 
                            [7] => 
                            [8] =>  
                        )

                    [1] => Array
                        (
                            [0] => typeJob
                            [1] => 956
                            [2] => Awesome project, Step 1 
                            [3] =>  
                            [4] =>  
                            [5] => 1833.3333
                            [6] => 1833.3333
                            [7] => 1833.3333
                            [8] =>  
                        )

                    [2] => Array
                        (
                            [0] => typePipeline
                            [1] => 957
                            [2] => Awesome project, Step 2 
                            [3] =>  
                            [4] =>  
                            [5] => 7000
                            [6] => 
                            [7] => 
                            [8] =>  
                        )

                )

        )

    [344] => Array
        (
            [KeyAccountID] => 1234
            [KeyAccountName] => John Lennon
            [ClientID] => 9998
            [Client] => ABC
            [projects] => Array
                (
                    [0] => Array
                        (
                            [0] => typePipeline
                            [1] => 487
                            [2] => CRM integration
                            [3] =>  
                            [4] =>  
                            [5] => 
                            [6] => 98750
                            [7] => 98750
                            [8] =>  
                        )

                    [1] => Array
                        (
                            [0] => typeJob
                            [1] => 839
                            [2] => Data Warehouse
                            [3] =>  
                            [4] =>  
                            [5] => 
                            [6] => 11643.0601
                            [7] => 
                            [8] =>  
                        )

                )

        )

    [350] => Array
        (
            [KeyAccountID] => 1236
            [KeyAccountName] => Ringo Starr
            [ClientID] => 9997
            [Client] => XYY
            [projects] => Array
                (
                    [0] => Array
                        (
                            [0] => typeJob
                            [1] => 867
                            [2] => Data Mining
                            [3] =>  
                            [4] =>  
                            [5] => 10000
                            [6] => 
                            [7] => 
                            [8] =>  
                        )

                )

        )

    [351] => Array
        (
            [KeyAccountID] => 1235
            [KeyAccountName] => Poul McCartney
            [ClientID] => 9996
            [Client] => XYZ
            [projects] => Array
                (
                    [0] => Array
                        (
                            [0] => typePipeline
                            [1] => 715
                            [2] => XYZ, CSM
                            [3] =>  
                            [4] =>  
                            [5] => 22083.3333
                            [6] => 22083.3333
                            [7] => 22083.3333
                            [8] =>  
                        )

                )

        )
etc.

在对值求和之前,可以过滤
$row['projects']
数组:

foreach ($arrays as $row) {
    $typeJobs = array_filter($row['projects'], function ($v) { return $v[0] == 'typeJob'; });
    $job_total1[$row['Client']] = array_sum(array_column($typeJobs,5));
    $job_total2[$row['Client']] = array_sum(array_column($typeJobs,6));
    $job_total3[$row['Client']] = array_sum(array_column($typeJobs,7));
}

它可能会更快地循环通过他们,并保持一个总运行

foreach ($arrays as $row) {
    $totals = [0,0,0];
    foreach ( $row['projects'] as $project )    {
        if ( $project[0] == 'typeJob' ) {
            $totals[0] += $project[5];
            $totals[1] += $project[6];
            $totals[2] += $project[7];
        }
    }
    $job_total1[$row['Client']] = $totals[0];
    $job_total2[$row['Client']] = $totals[1];
    $job_total3[$row['Client']] = $totals[2];
}

它看起来不像使用
array\uu…
方法那样纤细,但它只处理数组一次,而不是每次调用一次。

请发布您的示例输入的确切所需输出。始终以json或
var_export()
的显示值发布您的示例输入,以便志愿者能够更快、更准确地帮助您。您可能会发现@NigelRen solution更高效。感谢@NigelRen效率不是主要问题(数据量小)但我会尝试一下。@Mads请尊重我们的志愿者,他们不仅提供工作解决方案,而且费心优化流程。这一次您可能没有太多的数据要处理,但一旦您的项目中有了这些数据,您就有可能将其复制粘贴到其他地方,以用于具有更多数据的场景。接受最佳实践非常重要。