有没有办法对数组进行分组,排序和求和 我已经尝试了所有东西 - 有sort,array_unique,foreach等等。 以下数据是notionell。
Array
(
[0] => Array
(
[clientName] => Audi
[model] => A6
[cost] => 40.000
)
[1] => Array
(
[clientName] => Audi
[model] => S8
[cost] => 90.000
)
[2] => Array
(
[clientName] => VW
[model] => Golf V
[cost] => 5.000
)
[3] => Array
(
[clientName] => VW
[model] => Golf V
[cost] => 3.500
)
[4] => Array
(
[clientName] => Audi
[model] => RS6
[cost] => 120.000
)
[5] => Array
(
[clientName] => VW
[model] => Passat CC
[cost] => 35.000
)
)
我希望有这样的输出(在html中)
Audi total cost: 250.000 A6 40.000 S8 90.000 RS6 120.000 VW total cost: 43.500 Golf V 8.500 Passat CC 35.000
任何想法?
谢谢你的帮助!!
答案 0 :(得分:1)
尝试这样的事情:
<?php
$totals = [];
$models = [];
foreach ($array as $row) {
$totals[$row['clientName']] += $row['cost'];
$models[$row['clientName']][] = $row;
}
所以现在你有一个总数的数组,客户端名称作为键,以及一个包含模型数组的客户名称数组。
foreach($models as $client => $cars) {
echo $client.' total: '.$totals[$client].'<br />';
foreach($cars as $model) {
echo $model['model'].' '.$model['cost'].'<br />';
}
}
我没有测试过,所以可能需要调整,但希望thgat会为你工作!让我知道!
编辑:
<?php
$json = '[{"clientName":"Audi","model":"A6","cost":40000},{"clientName":"Audi","model":"S8","cost":90000},{"clientName":"VW","model":"GolfV","cost":5000},{"clientName":"VW","model":"GolfV","cost":3500},{"clientName":"Audi","model":"RS6","cost":120000},{"clientName":"VW","model":"PassatCC","cost":35000}]';
$array = json_decode($json, true);
$totals = [];
$makes = [];
$modelTotals = [];
foreach ($array as $row) {
// Set defaults to suppress notices
$totals[$row['clientName']] = isset($totals[$row['clientName']]) ? $totals[$row['clientName']] : 0;
$modelTotals[$row['model']] = isset($modelTotals[$row['model']]) ? $modelTotals[$row['model']] : 0;
$totals[$row['clientName']] += $row['cost'];
$makes[$row['clientName']][$row['model']] = $row;
$modelTotals[$row['model']] += $row['cost'];
}
foreach($makes as $client => $cars) {
echo $client.' total: '.$totals[$client]."\n";
foreach($cars as $model) {
echo $model['model'].' '.$modelTotals[$model['model']]."\n";
}
}
哪个输出:
Audi total: 250000
A6 40000
S8 90000
RS6 120000
VW total: 43500
GolfV 8500
PassatCC 35000
请在此处查看https://3v4l.org/kbkng
答案 1 :(得分:0)
下面的评论,自我解释片段做了特技。请注意,所有浮点值都已转换为整数。
<?php
$arr = [
[
'clientName' => 'Audi',
'model' => 'A6',
'cost' => 40000,
],
[
'clientName' => 'Audi',
'model' => 'S8',
'cost' => 90000,
],
[
'clientName' => 'VW',
'model' => 'Golf V',
'cost' => 5000,
],
[
'clientName' => 'VW',
'model' => 'Golf V',
'cost' => 3500,
],
[
'clientName' => 'Audi',
'model' => 'RS6',
'cost' => 120000,
],
[
'clientName' => 'VW',
'model' => 'Passat CC',
'cost' => 35000,
],
];
// A VARIABLE TO HOLD ALL GROUPED ENTRIES
$group = [];
// LOOP THROUGH THE ARRAY AND BUILD THE GROUPS BASED ON 'clientName' ENTRY
foreach($arr as $iKey=>$rData){
$sKey = $rData['clientName'];
if(!array_key_exists($sKey, $group)){
$group[$sKey] = ['total'=>$rData['cost'], $rData ];
}else{
$group[$sKey]['total'] += $rData['cost'];
$group[$sKey][] = $rData;
}
}
// RENDER TO REFLECT THE OP's END DATA-STRUCTURE
$result = "<table>";
foreach($group as $clName=>$groupData){
$result .= "<tr style='color'>";
$result .= "<th>{$clName}</th>";
$result .= "<th>{$groupData['total']}</th>";
$result .= "</tr>";
foreach($groupData as $k=>$v){
$result .= "<tr>";
$result .= "<td>{$v['model']}</td>";
$result .= "<td>{$v['cost']}</td>";
$result .= "</tr>";
}
$result .= "<tr><td colspan='2'> </td></tr>";
}
$result .= "</table>";
var_dump($group);
echo($result);
<强>更新强>
要将“Golf V”添加到列表中,您可能需要在上面的代码段中添加一个额外的嵌套if
条件块....这意味着要添加这样的内容:
<?php
if($mdlKey == 'Golf V'){
if(!array_key_exists($mdlKey, $group)){
$group[$mdlKey] = ['total'=>$rData['cost'], $rData ];
}else{
$group[$mdlKey]['total'] += $rData['cost'];
$group[$mdlKey][] = $rData;
}
}
最后,您的主要循环结构可能如下所示:
<?php
// A VARIABLE TO HOLD ALL GROUPED ENTRIES
$group = [];
// LOOP THROUGH THE ARRAY AND BUILD THE GROUPS BASED ON 'clientName' ENTRY
foreach($arr as $iKey=>$rData){
$sKey = $rData['clientName'];
$mdlKey = $rData['model'];
if(!array_key_exists($sKey, $group)){
$group[$sKey] = ['total'=>$rData['cost'], $rData ];
}else{
$group[$sKey]['total'] += $rData['cost'];
$group[$sKey][] = $rData;
}
if($mdlKey == 'Golf V'){
if(!array_key_exists($mdlKey, $group)){
$group[$mdlKey] = ['total'=>$rData['cost'], $rData ];
}else{
$group[$mdlKey]['total'] += $rData['cost'];
$group[$mdlKey][] = $rData;
}
}
}