如何解析数据库返回的多行列分隔文本为PHP关联数组?
解决文本解析生成指定关联数组的问题
问题分析
你当前的处理方式把所有内容用=拼接后拆分,导致表头、空行和数据混在一起,丢失了行的边界信息,后续的循环赋值逻辑也错误(每次循环都覆盖了$result,没有正确累加条目),所以得不到预期结构。
正确解决方案
我们可以按行处理文本,过滤掉空行和表头,再逐行提取需要的字段,具体步骤如下:
- 将原始文本按行拆分;
- 遍历每一行,跳过空行和表头行;
- 对有效行用
=分割,去除每个字段的空格; - 提取前两个字段(日期和费用),转换为对应类型后组装成目标结构。
完整代码示例
<?php // 原始数据 $data = <<<DATA DATE = FEE = PAYMENT 2021-03-09 = 119.25 = 119.25 = 2021-04-13 2021-03-15 = 119.25 = 119.25 = 2021-04-13 DATA; $result = []; // 按行拆分文本 $lines = explode(PHP_EOL, $data); foreach ($lines as $line) { // 去除行首尾空格 $trimmedLine = trim($line); // 跳过空行和表头行 if (empty($trimmedLine) || str_starts_with($trimmedLine, 'DATE')) { continue; } // 用=分割每行,并去除每个字段的空格 $fields = array_map('trim', explode('=', $trimmedLine)); // 提取日期和费用,组装目标数组 $result[] = [ 'Date' => $fields[0], 'fee' => (float)$fields[1], 'title' => 'example' ]; } // 输出格式化后的结果 echo json_encode($result, JSON_PRETTY_PRINT); ?>
执行结果
运行后会得到符合预期的结构:
[ { "Date": "2021-03-09", "fee": 119.25, "title": "example" }, { "Date": "2021-03-15", "fee": 119.25, "title": "example" } ]
补充说明
- 使用
str_starts_with需要PHP 8.0+,如果是低版本PHP,可以用substr($trimmedLine, 0, 4) === 'DATE'替代; array_map('trim', ...)确保每个字段的前后空格被清除,避免提取到带空格的无效值;- 将费用字段转为
float类型,符合预期的数值格式。
内容的提问来源于stack exchange,提问作者Foxx
相关产品推荐
相关产品推荐

