You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何匹配两数组键并输出对应值以生成CSV

解决CSV生成时键值对应错位的问题

问题根源

你的递归函数是按API返回数组的键顺序输出匹配值,而非遵循$vars表头的固定顺序;同时如果某个表头键在API数组中不存在,会直接跳过输出分隔符,导致CSV列错位。另外递归逻辑未处理嵌套键的路径记录,可能引发键匹配错误。

解决方案

  1. 生成固定顺序的表头:直接用指定分隔符拼接$vars数组作为CSV第一行。
  2. 扁平化嵌套API数据:将多层嵌套的数组转换为一维关联数组,确保所有键可直接访问。
  3. 按表头顺序取值:遍历$vars数组,逐个从扁平化后的数组中获取对应值,不存在则用空字符串填充,保证列顺序与表头完全对应。

代码实现

1. 扁平化嵌套数组函数

function flattenArray($array, $prefix = '') {
    $result = [];
    foreach ($array as $key => $value) {
        $newKey = $prefix ? "{$prefix}_{$key}" : $key;
        if (is_array($value)) {
            $result = array_merge($result, flattenArray($value, $newKey));
        } else {
            // 清理值中的换行符与HTML标签
            $cleanValue = $value ? str_replace(["\r\n", "\n\r", "\r", "\n", PHP_EOL], "", strip_tags($value)) : '';
            $result[$newKey] = $cleanValue;
        }
    }
    return $result;
}

2. 生成CSV单行数据函数

function generateCsvRow($apiData, $vars, $delimiter = '~') {
    $flatData = flattenArray($apiData);
    $row = [];
    foreach ($vars as $key) {
        $row[] = isset($flatData[$key]) ? $flatData[$key] : '';
    }
    echo implode($delimiter, $row) . PHP_EOL;
}

3. 实际使用示例

// 输出CSV表头
echo implode('~', $vars) . PHP_EOL;

// 遍历从API获取的所有数据数组
foreach ($apiDataList as $apiData) {
    generateCsvRow($apiData, $vars);
}

说明

  • 扁平化函数会将嵌套结构转换为一维键值对,例如['user' => ['email' => 'test@example.com']]会转为['user_email' => 'test@example.com'],只需确保$vars中的键与扁平化后的键一致即可。
  • 严格按$vars顺序取值,即使某个键不存在也会填充空字符串,彻底避免列错位问题。
  • 值的清理逻辑统一放在扁平化过程中,减少重复代码,保证数据格式一致。

内容的提问来源于stack exchange,提问作者Aleksa Markovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:33:26