
本文介绍一种高效、非递归的 php 实现方案,用于从嵌套数组中识别主档案(primary)与关联的二级档案(secondary),将二级档案数据合并至对应主档案,并最终生成符合 api 要求的键值对结构(如 {"primary":{...},"secondary":[{...},{...}]})。
在实际用户数据管理场景中,常存在“一个主档案 + 多个关联二级档案”的逻辑关系(例如同一用户注册了多个邮箱或设备档案)。原始数据以二维数组形式组织:每个子数组包含若干档案(profile_type 为 'primary' 或 'secondary'),但不存在深层嵌套树状结构——这意味着无需真正递归,而应采用清晰的两阶段处理策略:1) 按主档案分组;2) 归集其所属二级档案。
以下是一个健壮、可扩展的实现:
function mergeProfilesByPrimary($profilesArray): array
{
$result = [];
// 第一阶段:遍历所有顶层子数组(即每组 profile 集合)
foreach ($profilesArray as $group) {
if (!is_array($group)) {
continue;
}
$primary = null;
$secondaries = [];
// 第二阶段:在当前组内识别 primary 和 secondary
foreach ($group as $profile) {
if (!is_array($profile) || !isset($profile['profile_type'])) {
continue;
}
if ($profile['profile_type'] === 'primary' && $primary === null) {
$primary = $profile;
} elseif ($profile['profile_type'] === 'secondary') {
$secondaries[] = $profile;
}
}
// 若找到主档案,则构建合并结构
if ($primary !== null) {
$result[] = [
'primary' => $primary,
'secondary' => $secondaries,
'merge_count' => count($secondaries)
];
}
}
return $result;
}
// 使用示例
$merged = mergeProfilesByPrimary($testarray);
foreach ($merged as $item) {
// 构造标准 API 请求体(JSON 格式)
$payload = json_encode([
'primary' => ['email' => $item['primary']['email']],
'secondary' => array_map(fn($s) => ['email' => $s['email']], $item['secondary'])
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
echo "API Payload:\n" . $payload . "\n\n";
}✅ 关键设计说明:
- 避免无限循环:原代码误将未修改的 $profiles_array 重复传入递归调用,且未改变输入状态,导致死循环。本方案完全摒弃无意义递归,改用单层 foreach + 内层扫描,时间复杂度为 O(n),稳定可靠。
- 精准匹配逻辑:每个子数组视为一个独立“合并单元”,仅合并同组内的 secondary 到该组唯一的 primary(注意:示例数据中部分 secondary 的 id 与另一组 primary 相同,但按题意,跨组不合并,严格遵循数据物理分组)。
- 可扩展性保障:返回结构含 merge_count 字段,便于后续做空 secondary 容错处理;array_map 提取 email 的方式也易于替换为合并 newsletter、created_at 等字段。
⚠️ 注意事项:
- 若业务要求“全局去重合并”(如所有含 id='ccdbh-743748' 的 secondary 均合并至首个出现的同 ID primary),需先建立 ID → primary 映射表,再二次遍历 secondary 进行归集——此时可引入一次 foreach 循环预处理,仍无需递归。
- HTML 邮箱链接(含 __cf_email__)在生产环境建议服务端解密或由前端渲染,API 层宜传递纯邮箱字符串(可通过正则提取 data-cfemail 后解码,此处略)。
此方案简洁、高效、易测试,完美契合“扁平化分组合并”这一核心需求。










