如何在 PHP 中将多维数组中成对的 FAQ 问答项合并为结构化数据

本文介绍如何将第三方 api 返回的扁平化 faq 数据(每个问题和答案分属独立数组项)按逻辑配对,合并为结构清晰的问答对象数组,适用于 wordpress 自定义字段等典型场景。

在处理来自不可控第三方 API 的 FAQ 数据时,常见模式是:同一组问答被拆分为多个独立数组元素,其 meta_key 字段遵循统一命名规则(如 faq_list_0_question 和 faq_list_0_answer),而 meta_value 才是真正需要展示的内容。由于无法修改上游输出,我们必须在 PHP 端完成智能聚合。

核心思路是基于 meta_key 提取公共标识符(如 0),并按该标识符分组归并 question 与 answer 值。以下是推荐的健壮实现:

 (string)$index,
            'question' => '',
            'answer'   => ''
        ];
    }

    // 根据类型存入对应值
    if ($type === 'question') {
        $faqs[$index]['question'] = $item['meta_value'] ?? '';
    } elseif ($type === 'answer') {
        $faqs[$index]['answer'] = $item['meta_value'] ?? '';
    }
}

// 转为索引数组并保持顺序(可选)
$faqs = array_values($faqs);

// 输出结果(JSON 格式示例)
echo json_encode($faqs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>

输出示例

[
  {
    "id": "0",
    "question": "Lorem ipsum dolor sit amet, consectetur adipiscing elit?",
    "answer": "In at neque at nisl fringilla egestas sit amet tincidunt sem..."
  }
]

⚠️ 注意事项

  • 该方案不依赖 post_id 或 id 字段匹配,而是严格依据 meta_key 的语义结构,避免因数据错位导致问答错配;
  • 内置空值与格式校验,能安全跳过异常项,防止脚本中断;
  • 若实际 meta_key 命名规则不同(如 faq_1_q / faq_1_a),只需调整 explode 与 array_pop 的逻辑即可适配;
  • 如需保留原始 id 或 post_id,可在初始化 $faqs[$index] 时一并存入(例如 $faqs[$index]['post_id'] = $item['post_id'];),但注意确保同组问答该值一致。

此方法兼顾简洁性与生产环境所需的健壮性,是处理此类“伪结构化 API 数据”的标准实践。