Php 表中列的总计
我想计算一个表中一系列列的总数,我该怎么做 下面是我想总结的数据示例:Php 表中列的总计,php,laravel,laravel-4,Php,Laravel,Laravel 4,我想计算一个表中一系列列的总数,我该怎么做 下面是我想总结的数据示例: array:1 [ "traders" => array:6 [ "Jim Mayor__targeted_target" => array:2 [ "amounts" => array:13 [ 0 => 5 1 => 5 2 => 0 3 => 0 4 => 0
array:1 [
"traders" => array:6 [
"Jim Mayor__targeted_target" => array:2 [
"amounts" => array:13 [
0 => 5
1 => 5
2 => 0
3 => 0
4 => 0
5 => 0
6 => 0
7 => 0
8 => 0
9 => 0
10 => 0
11 => 0
]
"row_name" => "Targeted target"
]
"Jim Mayor__actual_targeted" => array:2 [
"amounts" => array:13 [
0 => 0
1 => 1
2 => 0
3 => 0
4 => 0
5 => 0
6 => 1
7 => 1
8 => 0
9 => 0
10 => 0
11 => 0
]
"row_name" => "Actual targeted"
]
"Bob Martinez__targeted_target" => array:2 [
"amounts" => array:13 [
0 => 1
1 => 0
2 => 0
3 => 0
4 => 0
5 => 0
6 => 0
7 => 0
8 => 0
9 => 0
10 => 0
11 => 0
]
"row_name" => "Targeted target"
]
"Bob Martinez__actual_targeted" => array:2 [
"amounts" => array:13 [
0 => 19
1 => 45
2 => 20
3 => 26
4 => 21
5 => 10
6 => 12
7 => 20
8 => 11
9 => 2
10 => 0
11 => 0
]
"row_name" => "Actual targeted"
]
...
我想将每个指数相加,例如,对于Jim Mayor_uuuTarget,指数0添加到Bob Martinez_uuuTarget的指数0中(这给出了1月份的总数)。它需要与数量不限的交易员合作
生成数据的函数:
protected function addRow($func, $params, $data, $year, $traderName, $rowName, $type, $image = null, $format = null, $underline = false)
{
$date = Carbon::createFromDate($year, 4, 1);
$total = 0;
$traderName = $traderName . '__' . str_replace(' ', '_', strtolower($rowName));
for ($i = 1; $i < 13; $i++) {
$params[1] = $date->year;
$params[2] = $date->month;
$result = call_user_func_array($func, $params);
$data['traders'][$traderName]['amounts'][] = $result ? $result : 0;
$total += $result;
$date->addMonth();
}
$data['traders'][$traderName]['amounts'][] = $total;
$data['traders'][$traderName]['row_name'] = $rowName;
return $data;
}
受保护的函数addRow($func、$params、$data、$year、$traderName、$rowName、$type、$image=null、$format=null、$underline=false)
{
$date=Carbon::createFromDate($year,4,1);
$total=0;
$traderName=$traderName.''.''.'.str'.'替换('''.''.''.'strtolower($rowName));
对于($i=1;$i<13;$i++){
$params[1]=$date->year;
$params[2]=$date->month;
$result=调用用户函数数组($func,$params);
$data['traders'][$traderName]['amounts'][]=$result?$result:0;
$total+=$result;
$date->addMonth();
}
$data['traders'][$traderName]['amounts'][]=$total;
$data['traders'][$traderName]['row\u name']=$rowName;
返回$data;
}
只需检查数据并将结果保存在其他数组中:
$results = array();
foreach ($traders as $trader) {
foreach ($trader['amounts'] as $i => $amount) {
if (!isset($results[$i])) {
$results[$i] = 0;
}
$results[$i] += $amount;
}
}
结果数组将包含所有交易者的总和
未测试,但应能正常工作。执行以下操作:
function sumRowsByMonth($traders)
{
$sums = array_fill(0, 12, 0);
foreach($traders as $trader) {
foreach($trader['amounts'] as $monthId => $amount) {
$sums[$monthId] += $amount;
}
}
return $sums;
}
我用这个测试:
$arr = array(
'traders' => array(
'Jim Mayor__targeted_target' => array(
'amounts' => array(
0 => 5,
1 => 5,
2 => 0,
3 => 0,
4 => 0,
5 => 0,
6 => 0,
7 => 0,
8 => 0,
9 => 0,
10 => 0,
11 => 0,
)
),
'Bob Martinez__targeted_target' => array(
'amounts' => array(
0 => 19,
1 => 45,
2 => 20,
3 => 26,
4 => 21,
5 => 10,
6 => 12,
7 => 20,
8 => 11,
9 => 2,
10 => 0,
11 => 0,
)
),
),
);
var_dump(sumRowsByMonth($arr['traders']));
使用函数
array\u sum()
返回数组中的值之和
另外,您说过要分别计算目标
和实际目标
$actual = [];
$targeted = [];
foreach ($traders as $trader) {
$sum = array_sum($trader['anmounts']);
$trader['row_name'] === 'Actual targeted') ? $actual += $sum : $target += $sum;
}
也许您需要对此进行一点修改以调整行为,但我想我明白了。@imperium2335:
我一直遇到的主要问题是,它将所有行相加,包括实际的行。实际的目标需要分组并分别汇总到目标 然后这样做:
function sumRowsByMonth($traders)
{
$sums = array();
foreach($traders as $traderName => $trader) {
$type = strstr($traderName, '__');
if( empty($sums[$type]) ) {
$sums[$type] = array_fill(0, 12, 0);
}
foreach($trader['amounts'] as $monthId => $amount) {
$sums[$type][$monthId] += $amount;
}
}
return $sums;
}
请阅读以下内容:
我一直遇到的主要问题是,它将所有行相加,包括实际值。实际目标需要分组并分别汇总到目标目标。我使用strstr发送了另一个答案。谢谢,但问题是名称也是动态的,所以“实际目标”可以是任何内容。@imperium2335向数组添加一些静态标志。