我将按字面意思解释这个问题,并提供准确描述的输出结构。
临时复合键允许非常快速地查找以前遇到的brand
-model
对。重要的是使用分隔符(在任何一个值中都没有使用)来分隔复合字符串中的每个值,这样就不会出现意外的“数据冲突”。
如果给定的“品牌-型号”组合仅出现一次,则将原始行结构推入结果数组。否则,“大小”数据将转换为索引数组,并将后续唯一大小值推入子数组。
经典foreach()
:(演示)(使用 array_unique 删除潜在的重复大小)
$result = [];
foreach ($array as $row) {
$compositeKey = $row['brand'] . '_' . $row['model'];
if (!isset($result[$compositeKey])) {
$result[$compositeKey] = $row;
} else {
$result[$compositeKey]['size'] = array_merge(
(array)$result[$compositeKey]['size'],
[$row['size']]
);
}
}
var_export($result);
函数式编程array_reduce()
:(演示)
var_export(
array_values(
array_reduce(
$array,
function ($carry, $row) {
$compositeKey = $row['brand'] . '_' . $row['model'];
if (!isset($carry[$compositeKey])) {
$carry[$compositeKey] = $row;
} else {
$carry[$compositeKey]['size'] = array_merge(
(array)$carry[$compositeKey]['size'],
[$row['size']]
);
}
return $carry;
}
)
)
);
老实说,我会为我的输出创建一个一致的数据结构,并且大小总是一个子数组。以下是如何修改上面的代码片段以在第一次遇到时将 size 元素转换为数组,并将所有随后遇到的 size 值推送到该组的子数组中:( Demo )
$result = [];
foreach ($array as $row) {
$compositeKey = $row['brand'] . '_' . $row['model'];
if (!isset($result[$compositeKey])) {
$row['size'] = (array)$row['size'];
$result[$compositeKey] = $row;
} else {
$result[$compositeKey]['size'][] = $row['size'];
}
}
var_export(array_values($result));