如何解决PHP合并具有相似键的数组,并对一些键求和
在打扰这个很棒的社区之前,我真的为此挣扎了一天多,但我没有运气。
$Data = [
[
'code' => 'P-01','firstname' => 'Sam','lastname' => 'Bouchard','quantity' => 3
],[
'code' => 'P-09','firstname' => 'Roy','lastname' => 'Gauthier','quantity' => 14
],[
'code' => 'P-24','firstname' => 'Marin','lastname' => 'Fortin','quantity' => 24
],[
'code' => 'P-03','quantity' => 7
],[
'code' => 'P-01','quantity' => 9
],];
所以我想合并数组所以我有这样的数组
$Data = [
[
'firstname' => 'Sam','combined' => [
'code' => 'P-01','quantity' => 12
],[
'code'=> 'P-03','quantity' => 7
]
],[
'firstname' => 'Roy','combined' => [
'code' => 'P-09','quantity' => 14
]
],[
'firstname' => 'Marin','combined' => [
'code' => 'P-24','quantity' => 24
]
],];
解决方法
在以下示例中,您将获得具有唯一代码键的新合并数组。此外,它将前一个数量添加到下一个。
$Merged = [];
foreach ($Data as $value) {
if (isset($Merged[$value['code']])) {
$Merged[$value['code']]['quantity'] += $value['quantity'];
} else {
$Merged[$value['code']] = $value;
}
}
输出
Array
(
[P-01] => Array
(
[code] => P-01
[firstname] => Sam
[lastname] => Bouchard
[quantity] => 12
)
[P-09] => Array
(
[code] => P-09
[firstname] => Roy
[lastname] => Gauthier
[quantity] => 14
)
[P-24] => Array
(
[code] => P-24
[firstname] => Marin
[lastname] => Fortin
[quantity] => 24
)
[P-03] => Array
(
[code] => P-03
[firstname] => Sam
[lastname] => Bouchard
[quantity] => 7
)
)
,
输入数据
请注意,您显示的数组在格式方面存在一些错误(可能是拼写错误)。我们将使用:
$data = [
[
'code' => 'P-01','firstname' => 'Sam','lastname' => 'Bouchard','quantity' => 3
],[
'code' => 'P-09','firstname' => 'Roy','lastname' => 'Gauthier','quantity' => 14
],[
'code' => 'P-24','firstname' => 'Marin','lastname' => 'Fortin','quantity' => 24
],[
'code' => 'P-03','quantity' => 7
],[
'code' => 'P-01','quantity' => 9
]
];
变换数组
首先,我们想将数组转换为一个我们可以轻松使用的数据结构,同时我们可以组合和更新数量。
在这种情况下,我们将重新组织三个级别的索引firstname -> lastname -> code
// Define the array for output of transformation
$firstnameIndexArray = [];
// Loop through all current data points
foreach($data as $point){
// Set a pointer by reference to decrease the length of the next line(!) hopefully
// making it more readable
$pointer = &$firstnameIndexArray[$point['firstname']][$point['lastname']][$point['code']];
// Update the quantity
// $pointer ?? 0... sets to 0 if $pointer doesn't contain a value/exist
$pointer = ($pointer ?? 0) + $point["quantity"];
}
现在我们已经完成了,我们有一个看起来像这样的数组:
Array
(
[Sam] => Array
(
[Bouchard] => Array
(
[P-01] => 12
[P-03] => 7
)
)
[Roy] => Array
(
[Gauthier] => Array
(
[P-09] => 14
)
)
[Marin] => Array
(
[Fortin] => Array
(
[P-24] => 24
)
)
)
以正确的格式重新制作数组
现在剩下要做的就是遍历转换后的数组并以我们选择的格式输出...
// Define the output array
$finalArray = [];
// Loop through first level of array
foreach($firstnameIndexArray as $firstname => $lastnameIndexarray){
// Loop through second level of array
foreach($lastnameIndexarray as $lastname => $codeIndexArray){
// Define the combined array of code/value pairs
$combinedArray = [];
// Loop though each code/value pair
foreach($codeIndexArray as $code => $quantity){
// Make the combined array in the correct format
$combinedArray[] = [
'code' => $code,'quantity' => $quantity
];
}
// Add the person to the final array
$finalArray[] = [
'firstname' => $firstname,'lastname' => $lastname,'combined' => $combinedArray
];
}
}
输出如下:
Array
(
[0] => Array
(
[firstname] => Sam
[lastname] => Bouchard
[combined] => Array
(
[0] => Array
(
[code] => P-01
[quantity] => 12
)
[1] => Array
(
[code] => P-03
[quantity] => 7
)
)
)
[1] => Array
(
[firstname] => Roy
[lastname] => Gauthier
[combined] => Array
(
[0] => Array
(
[code] => P-09
[quantity] => 14
)
)
)
[2] => Array
(
[firstname] => Marin
[lastname] => Fortin
[combined] => Array
(
[0] => Array
(
[code] => P-24
[quantity] => 24
)
)
)
)
没有注释的代码
$firstnameIndexArray = [];
foreach($data as $point){
$pointer = &$firstnameIndexArray[$point['firstname']][$point['lastname']][$point['code']];
$pointer = ($pointer ?? 0) + $point["quantity"];
}
$finalArray = [];
foreach($firstnameIndexArray as $firstname => $lastnameIndexarray){
foreach($lastnameIndexarray as $lastname => $codeIndexArray){
$combinedArray = [];
foreach($codeIndexArray as $code => $quantity){
$combinedArray[] = [
'code' => $code,'quantity' => $quantity
];
}
$finalArray[] = [
'firstname' => $firstname,'combined' => $combinedArray
];
}
}
,
可能的方法是使用“代码”作为新数组的索引:
创建一个新的结果数组
$combined = [];
遍历 $Data 并将每个项目放入 $item 对于每个 $item 将代码作为 $key 检查组合数组中是否已有值与该 $key
if (isset($combined[$key]))) {...}
如果没有,使用该 $key 将项目添加到数组
$newItem = $this->createNewStructureFromItem($item);
$combined[$key] = $newItem;
如果组合数组中已经有那个键,只更新数量
$existingItem = $combined[$key];
$updatedItem = $this->increaseQuantity($existingItem,$item);
$combined[$key] = $updatedItem;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。