Php 获取索引行的子数组列的和
我有一系列客户/人员,他们拥有与该客户相关的项目子阵列。项目分为两种类型:“typeJob”或“typePipeline”。我需要按客户对projects子数组中各个列的值进行求和(特别是第5、6、7列-表示第1个月、第2个月和第3个月的收入) 我尝试了各种可能的方法,包括下面的方法,但我似乎总是以测试整个数组而不是每一行是否满足条件为结束,或者如果我选择了for each循环生成错误的方式,因为要么是数组/单个值不匹配,要么是条件没有任何作用 这是我最近试过的。它的工作原理是检查数组中是否有“typeJob”,但如果为客户的任何项目找到了“typeJob”,则对所有行(即使是没有“typeJob”的行)求和。我想排除找不到“typeJob”的行Php 获取索引行的子数组列的和,php,arrays,Php,Arrays,我有一系列客户/人员,他们拥有与该客户相关的项目子阵列。项目分为两种类型:“typeJob”或“typePipeline”。我需要按客户对projects子数组中各个列的值进行求和(特别是第5、6、7列-表示第1个月、第2个月和第3个月的收入) 我尝试了各种可能的方法,包括下面的方法,但我似乎总是以测试整个数组而不是每一行是否满足条件为结束,或者如果我选择了for each循环生成错误的方式,因为要么是数组/单个值不匹配,要么是条件没有任何作用 这是我最近试过的。它的工作原理是检查数组中是否有“
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请尊重我们的志愿者,他们不仅提供工作解决方案,而且费心优化流程。这一次您可能没有太多的数据要处理,但一旦您的项目中有了这些数据,您就有可能将其复制粘贴到其他地方,以用于具有更多数据的场景。接受最佳实践非常重要。