
本文介绍一种基于类别(tx)反向聚合值(rx)的 php 数组分组策略,通过构建“类别→值列表”映射、排序归一化键、合并相同值组合,最终实现按最大公共值集优先分组的目标结构。
本文介绍一种基于类别(tx)反向聚合值(rx)的 php 数组分组策略,通过构建“类别→值列表”映射、排序归一化键、合并相同值组合,最终实现按最大公共值集优先分组的目标结构。
在处理多维分类数据时,常见的分组逻辑是“按某个字段聚合”,但本例要求逆向建模:不以 value(如 'R1')为轴心,而以 categories(如 'T1')为切入点,统计每个类别被哪些 value 共同覆盖,再将拥有完全相同 value 集合的类别合并为一组——这本质上是求“值集合 → 类别集合”的双射映射,并遵循“最大化公共值集优先”原则(例如 [R1,R2,R3,R4] 优先于 [R1,R2,R3])。
核心思路三步走
- 分离空值(NULL)特例:value === null 或 category === null 的条目不参与主逻辑,直接进入结果集;
- 构建倒排索引:遍历所有非空条目,对每个 Tn 记录其所归属的所有 Rn,形成 $categories['T1'] = ['R1','R2','R3','R4'];
- 归一化键合并:对每个 Tn 对应的 Rn 数组排序后拼接为字符串键(如 'R1R2R3R4'),以此为枢纽合并同类 Tn,确保相同 Rn 组合只生成一个输出项。
完整可运行代码示例
<?php
$input = [
['value' => null, 'categories' => ['T1', 'T2', 'T5']],
['value' => 'R1', 'categories' => [null, 'T1', 'T2', 'T3', 'T4', 'T5', 'T6']],
['value' => 'R2', 'categories' => ['T1', 'T2', 'T3']],
['value' => 'R3', 'categories' => ['T1', 'T2', 'T3']],
['value' => 'R4', 'categories' => ['T1', 'T2']],
];
$nulls = [];
$categories = [];
$tmp = [];
// Step 1: 分离 NULL 并构建倒排索引
foreach ($input as $inp) {
if ($inp['value'] === null) {
$nulls[] = ['values' => [null], 'categories' => $inp['categories']];
continue;
}
$Rx = $inp['value'];
foreach ($inp['categories'] as $Tx) {
if ($Tx === null) {
$nulls[] = ['values' => [$Rx], 'categories' => [null]];
continue;
}
$categories[$Tx][] = $Rx;
}
}
// Step 2: 按 Rn 集合归一化分组
foreach ($categories as $Tx => $RxList) {
sort($RxList); // 关键:确保顺序一致,避免 R1R2 与 R2R1 被视为不同键
$key = implode('', $RxList);
if (!isset($tmp[$key])) {
$tmp[$key] = ['values' => $RxList, 'categories' => []];
}
$tmp[$key]['categories'][] = $Tx;
}
// Step 3: 合并结果(NULL 项在前,其余按需追加)
$result = $nulls;
foreach ($tmp as $group) {
$result[] = [
'values' => $group['values'],
'categories' => $group['categories']
];
}
print_r($result);
?>注意事项与优化建议
- ✅ 必须排序再拼接:sort($RxList) 是保证键唯一性的前提,否则相同元素不同顺序会产生冗余分组;
- ⚠️ NULL 处理需严格区分:=== null 判断不可替换为 == null 或 empty(),避免误判字符串 '0' 或 0;
- ? 可扩展性提示:若 value 或 category 本身含特殊字符(如逗号、空格),建议改用 json_encode($RxList) 作为键,更健壮;
- ? 逻辑验证建议:对结果中每个 values 数组,可反查原始数据确认其 categories 交集是否精确匹配(即每个 Rn 都包含该组全部 Tn,且无额外 Tn)。
该方案时间复杂度为 O(n·m + k·log k)(n 为输入项数,m 为平均 category 数,k 为去重后 value 组合数),兼顾可读性与工程实用性,适用于中等规模分类聚合场景。



















