如何按指定表头读取数组记录并生成4列结构化数组?
按表头列边界拆分固定对齐文本为结构化数组
核心思路
这类固定列宽对齐的文本,核心是先通过表头确定每一列的起始位置边界,再用这些边界去切割每一行的内容,最终得到结构化的键值对数组。
具体实现(PHP示例)
假设$rolerows是存储了所有行的数组,代码如下:
// 第一步:清理数组中的空行,仅保留有效内容行 $validRows = array_filter($rolerows, function($row) { return trim($row) !== ''; }); // 第二步:提取表头行的列边界位置 $headerRow = reset($validRows); // 匹配表头中所有非空格字段,同时获取每个字段的起始索引 preg_match_all('/\S+/', $headerRow, $headerMatches, PREG_OFFSET_CAPTURE); // 提取各列的起始偏移量,最后追加字符串长度作为最后一列的结束边界 $columnOffsets = array_column($headerMatches[0], 1); $columnOffsets[] = strlen($headerRow); // 第三步:遍历数据行,按列边界切割生成结构化数组 $structuredRoles = []; foreach (array_slice($validRows, 1) as $dataRow) { $roleItem = []; foreach ($headerMatches[0] as $index => $headerInfo) { $colName = $headerInfo[0]; $start = $columnOffsets[$index]; $end = $columnOffsets[$index + 1]; // 截取列内容并去除前后冗余空格 $colValue = trim(substr($dataRow, $start, $end - $start)); $roleItem[$colName] = $colValue; } $structuredRoles[] = $roleItem; } // 输出结构化后的数组 print_r($structuredRoles);
关键说明
- 空行清理:避免处理无意义的空白内容,保证后续解析的准确性
- 列边界获取:通过正则匹配表头的非空格字段,拿到每个列的起始位置,这是实现精准切割的核心
- 内容切割:按起始/结束位置截取每行文本,再用
trim去除列内前后的冗余空格,得到干净的字段值
内容的提问来源于stack exchange,提问作者Lord OfTheRing
相关产品推荐
相关产品推荐

