PHP如何匹配两数组键并输出对应值以生成CSV
解决CSV生成时键值对应错位的问题
问题根源
你的递归函数是按API返回数组的键顺序输出匹配值,而非遵循$vars表头的固定顺序;同时如果某个表头键在API数组中不存在,会直接跳过输出分隔符,导致CSV列错位。另外递归逻辑未处理嵌套键的路径记录,可能引发键匹配错误。
解决方案
- 生成固定顺序的表头:直接用指定分隔符拼接
$vars数组作为CSV第一行。 - 扁平化嵌套API数据:将多层嵌套的数组转换为一维关联数组,确保所有键可直接访问。
- 按表头顺序取值:遍历
$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
相关产品推荐
相关产品推荐

