
本文介绍如何将含 color、size、count 字段的二维数组,按 color 分组,并为每个 color 下的 size 数据生成灵活结构:单个 size 时扁平化输出("size"=>"l","count"=>1),多个 size 时转为对象数组("size"=>[{"value":"l","count":2},...])。
本文介绍如何将含 color、size、count 字段的二维数组,按 color 分组,并为每个 color 下的 size 数据生成灵活结构:单个 size 时扁平化输出("size"=>"l","count"=>1),多个 size 时转为对象数组("size"=>[{"value":"l","count":2},...])。
在电商或库存类系统中,常需将原始商品变体数据(如不同颜色与尺码组合)聚合成更语义化、前端友好的嵌套结构。本教程提供一种清晰、可维护的 PHP 实现方案,兼顾逻辑可读性与结构灵活性。
核心思路:两阶段处理
我们采用「先聚合、后构造」的两阶段策略:
-
第一阶段(归类):以
color为键,收集所有对应size => count映射; -
第二阶段(结构化):遍历归类结果,根据每个 color 下的 size 数量决定最终字段形态——单条时直接展开为
"size"=>"L","count"=>1,多条时封装为"size"=>[{"value":"L","count":2}, ...]。
完整实现代码
<?php $array = [
['color' => '#000000', 'size' => 'L', 'count' => 2],
['color' => '#000000', 'size' => 'XL', 'count' => 1],
['color' => '#ffffff', 'size' => 'L', 'count' => 2],
['color' => '#ffffff', 'size' => 'XL', 'count' => 1],
['color' => '#ff0000', 'size' => 'L', 'count' => 1]
];
// 阶段一:按 color 聚合 size => count 映射
$groupedByColor = [];
foreach ($array as $row) {
$color = $row['color'];
$size = $row['size'];
$count = $row['count'];
if (!isset($groupedByColor[$color])) {
$groupedByColor[$color] = [];
}
$groupedByColor[$color][$size] = $count;
}
// 阶段二:构造目标结构(支持单/多 size 的混合输出)
$output = [];
foreach ($groupedByColor as $color => $sizes) {
$sizeEntries = [];
foreach ($sizes as $size => $count) {
$sizeEntries[] = ['value' => $size, 'count' => $count];
}
// 关键逻辑:单条 size 时扁平化,否则保留数组结构
if (count($sizeEntries) === 1) {
$output[] = [
'color' => $color,
'size' => $sizeEntries[0]['value'],
'count' => $sizeEntries[0]['count']
];
} else {
$output[] = [
'color' => $color,
'size' => $sizeEntries
];
}
}
// 输出标准化 JSON(带缩进,便于调试)
echo json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>
输出结果(符合题设要求)
[
{
"color": "#000000",
"size": [
{
"value": "L",
"count": 2
},
{
"value": "XL",
"count": 1
}
]
},
{
"color": "#ffffff",
"size": [
{
"value": "L",
"count": 2
},
{
"value": "XL",
"count": 1
}
]
},
{
"color": "#ff0000",
"size": "L",
"count": 1
}
]
注意事项与最佳实践
- ✅ 避免
extract()的滥用:原答案中使用extract()虽简洁,但在复杂作用域易引发变量污染。本实现显式解构字段,更安全、更易调试; - ✅ 输入健壮性:代码默认假设无重复
color+size组合;若存在重复,后出现的count将覆盖前者。如需累加,可将$groupedByColor[$color][$size] += $count;; - ✅ 可封装为函数:建议将上述逻辑封装为
groupProductsByColor(array $data): array,提升复用性; - ⚠️ JSON 编码注意:生产环境应检查
json_last_error(),避免因非法字符导致空输出; - ? 前端兼容提示:该结构对前端渲染友好——可通过
Array.isArray(item.size)快速判断是否需循环渲染尺码列表。
通过这种分层设计,你既能精准满足动态深度结构需求,又保持了代码的高可读性与可扩展性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











