

新闻资讯
技术学院本文介绍一种高效、非递归的 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";
}✅ 关键设计说明:
⚠️ 注意事项:
此方案简洁、高效、易测试,完美契合“扁平化分组合并”这一核心需求。