Php 如何对具有按类别排序的相同键的数组的值求和?
Php 如何对具有按类别排序的相同键的数组的值求和?,php,arrays,sum,key,Php,Arrays,Sum,Key,类别: array:3 [▼ "78f895684c" => "blue" "f71db561ba" => "green" "3e231651de" => "blue" ] numbersGroup: array:3 [▼ 0 => array:4 [▼ "uuid" => "78f895684c" "price" => "10" "discount" => "0" "total" => "10.0
类别
:
array:3 [▼
"78f895684c" => "blue"
"f71db561ba" => "green"
"3e231651de" => "blue"
]
numbersGroup:
array:3 [▼
0 => array:4 [▼
"uuid" => "78f895684c"
"price" => "10"
"discount" => "0"
"total" => "10.00"
]
1 => array:4 [▼
"uuid" => "f71db561ba"
"price" => "2"
"discount" => "0"
"total" => "2.00"
]
2 => array:4 [▼
"uuid" => "3e231651de"
"price" => "50"
"discount" => "10"
"total" => "40.00"
]
]
我尝试创建一个数组,将我的项目分类,同时也将一个类别中的所有项目相加。这就是我所拥有的:
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
unset($group['uuid']);
$numbersArray[$cat][] = $group;
}
结果是:
array:2 [▼
"blue" => array:2 [▼
0 => array:3 [▼
"price" => "10"
"discount" => "0"
"total" => "10.00"
]
1 => array:3 [▼
"price" => "50"
"discount" => "10"
"total" => "40.00"
]
]
"green" => array:1 [▼
0 => array:3 [▼
"price" => "2"
"discount" => "0"
"total" => "2.00"
]
]
]
这就是我努力实现的目标:
array:2 [▼
"blue" => array:2 [▼
0 => array:3 [▼
"price" => "60"
"discount" => "10"
"total" => "50.00"
]
]
"green" => array:1 [▼
0 => array:3 [▼
"price" => "2"
"discount" => "0"
"total" => "2.00"
]
]
]
这是我的方法:
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
unset($group['uuid']);
foreach ($group as $key => $value) {
$sum += $value;
}
$numbersArray[$cat][] = $sum;
}
但我得到了一个错误:
不支持的操作数类型
你能试试下面的代码吗
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
if(!isset( $numbersArray[$cat][0]) )
$numbersArray[$cat][] = $group;
else{
// If index is known, you can use below code
/*$numbersArray[$cat][0]["price"]+= $group['price'];
$numbersArray[$cat][0]["discount"]+= $group['discount'];
$numbersArray[$cat][0]["total"]+= $group['total'];*/
// If index is not known
foreach($group as $key => $value){
if (is_numeric($value)) {
$numbersArray[$cat][0][$key]+= $group[$key];
}
}
}
}
现在我添加了数组索引未知的情况。我们需要在添加值之前进行数字检查。
我希望这能帮助你:)你能试试下面的代码吗
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
if(!isset( $numbersArray[$cat][0]) )
$numbersArray[$cat][] = $group;
else{
// If index is known, you can use below code
/*$numbersArray[$cat][0]["price"]+= $group['price'];
$numbersArray[$cat][0]["discount"]+= $group['discount'];
$numbersArray[$cat][0]["total"]+= $group['total'];*/
// If index is not known
foreach($group as $key => $value){
if (is_numeric($value)) {
$numbersArray[$cat][0][$key]+= $group[$key];
}
}
}
}
现在我添加了数组索引未知的情况。我们需要在添加值之前进行数字检查。
我希望这对您有所帮助:)检查
$numbersArray[$cat]
是否已设置-如果已设置,请不要添加新的数组元素,而是将单个值添加到现有数组键中
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
unset($group['uuid']);
if(isset($numbersArray[$cat])) {
$numbersArray[$cat]['price'] += $group['price'];
$numbersArray[$cat]['discount'] += $group['discount'];
$numbersArray[$cat]['total'] += $group['total'];
}
else {
$numbersArray[$cat] = $group; // no [] here, because we want only a single element
}
}
或者,在没有明确if的情况下,使用??运算符:
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
$numbersArray[$cat]['price'] = ($numbersArray[$cat]['price'] ?? 0) + $group['price'];
$numbersArray[$cat]['discount'] = ($numbersArray[$cat]['discount'] ?? 0) + $group['discount'];
$numbersArray[$cat]['total'] = ($numbersArray[$cat]['total'] ?? 0) + $group['total'];
}
--
编辑:
不幸的是,我无法在代码中写入“价格”、“折扣”等,因为这些值总是不同的,不能硬编码
然后循环使用您从组中获得的密钥,因为您已经尝试使用初始代码:
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
unset($group['uuid']);
foreach($group as $key => $value) {
$numbersArray[$cat][$key] = ($numbersArray[$cat][$key] ?? 0) + $value;
}
}
检查$numbersArray[$cat]
是否已设置-如果已设置,则不要添加新数组元素,而是将单个值添加到现有数组键
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
unset($group['uuid']);
if(isset($numbersArray[$cat])) {
$numbersArray[$cat]['price'] += $group['price'];
$numbersArray[$cat]['discount'] += $group['discount'];
$numbersArray[$cat]['total'] += $group['total'];
}
else {
$numbersArray[$cat] = $group; // no [] here, because we want only a single element
}
}
或者,在没有明确if的情况下,使用??运算符:
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
$numbersArray[$cat]['price'] = ($numbersArray[$cat]['price'] ?? 0) + $group['price'];
$numbersArray[$cat]['discount'] = ($numbersArray[$cat]['discount'] ?? 0) + $group['discount'];
$numbersArray[$cat]['total'] = ($numbersArray[$cat]['total'] ?? 0) + $group['total'];
}
--
编辑:
不幸的是,我无法在代码中写入“价格”、“折扣”等,因为这些值总是不同的,不能硬编码
然后循环使用您从组中获得的密钥,因为您已经尝试使用初始代码:
foreach ($numbersGroup as $group) {
$cat = $category[$group['uuid']];
unset($group['uuid']);
foreach($group as $key => $value) {
$numbersArray[$cat][$key] = ($numbersArray[$cat][$key] ?? 0) + $value;
}
}
检查$numbersArray[$cat]
是否已设置-如果已设置,则不要添加新的数组元素,而是将单个值添加到现有数组键。@04FS当我转储($numbersArray[$cat])
然后我得到错误未定义变量:numbersArray
dump
是一个调试函数-检查变量或数组键是否已设置是isset
的工作。检查$numbersArray[$cat]
是否已设置-如果已设置,请不要添加新的数组元素,但将单个值添加到现有数组键中。@04FS当Idump($numbersArray[$cat])
然后我得到错误未定义变量:numbersArray
dump
是一个调试函数-检查变量或数组键是否已设置,这是isset
的工作。不幸的是,我无法在代码中写入“价格”、“折扣”等,因为这些值总是不同的,这是不可能的hardcoded@peace_love参见编辑,然后循环你在组中得到的密钥,就像你已经尝试过的那样。你在两个地方都相应地修改了它吗<代码>$numbersArray[$cat]['sum'][$key]=($numbersArray[$cat]['sum'][$key]?0)+$value代码>(但在我的问题中,您看到,它从一开始就被要求提供子键解决方案)是的,有点-您有数字键。我的意思是更多地结合键必须是动态的…没关系,只要问题得到解决:-)很遗憾,我不能在我的代码中写入“价格”、“折扣”等,因为这些值总是不同的,这是不可能的hardcoded@peace_love请参见编辑,在组中获得的关键点上循环,正如您在初始尝试中所做的那样。您是否在两个位置都相应地修改了它<代码>$numbersArray[$cat]['sum'][$key]=($numbersArray[$cat]['sum'][$key]?0)+$value代码>(但在我的问题中,您看到,它从一开始就被要求提供子键解决方案)是的,有点-您有数字键。我的意思是更多地结合键必须是动态的…没关系,只要问题解决:-)我不幸需要一个非硬编码的解决方案,因为它不是alwas价格,有时还有其他值,或者更多值。我不幸需要一个非硬编码的解决方案,因为它不是alwas价格,有时还有其他值,或更多值