输入数据
请注意,您显示的数组在格式上有一些错误(可能是拼写错误)。我们将使用:
$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',
'firstname' => 'Sam',
'lastname' => 'Bouchard',
'quantity' => 7
],
[
'code' => 'P-01',
'firstname' => 'Sam',
'lastname' => 'Bouchard',
'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
)
)
)
)
没有 cmets 的代码
$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,
'lastname' => $lastname,
'combined' => $combinedArray
];
}
}