PHP读取文本生成城市人口关联数组排序输出表格报错修复
问题根因
你遇到的报错和逻辑错误来自4个核心问题:
- 行拆分逻辑错误:用
explode(' ', $row)按单个空格拆分内容,无法处理城市名和人口之间的多个制表符/空格,也会把Sao Paulo、Mexico City这类带空格的多词城市名拆成多个独立元素,还会生成大量空数组项。 - 无意义的点拆分逻辑:你的数据里城市名根本不存在
.字符,explode('.', $data[$index][0])这步完全多余,会破坏原有数据结构。 - 空行未过滤:文件末尾通常会有换行,
feof()会读到最后空行,空行拆分后不存在索引1的元素,直接触发你看到的Undefined array key 1警告。 - 数组结构不符合需求:你没有按要求用城市名作为键、人口作为值构建关联数组,后续排序、表格输出的逻辑都基于错误的数组结构编写,甚至表格多写了一列单元格,和表头列数不匹配,自然输出异常。
修复方案
直接按需求重构逻辑即可,核心步骤:
- 读取每行时先过滤首尾空白,跳过空行
- 按任意数量的空白字符(空格、制表符)拆分每行,最后一个元素是人口数,前面所有元素拼接起来是完整城市名
- 构建城市为键、人口为整数值的关联数组
- 用
arsort()按人口数降序排序(保留键值关联关系,不要用usort/sort,会丢失键名) - 遍历关联数组输出表格,删除多余列
完整可运行代码
<?php $fileHandler = fopen("Info_array.txt", "rb"); $data = []; if ($fileHandler) { while (!feof($fileHandler)) { $row = trim(fgets($fileHandler)); // 跳过空行 if (empty($row)) { continue; } // 按1个或多个空白字符拆分行,兼容空格、制表符分隔 $parts = preg_split('/\s+/', $row); // 最后一个元素是人口,前面所有部分拼接为完整城市名 $population = (int)array_pop($parts); $cityName = implode(' ', $parts); $data[$cityName] = $population; } fclose($fileHandler); } // 按人口值降序排序,保留键值关联关系 arsort($data); ?> <table class="heavyTable"> <thead> <tr> <th>City</th> <th>Population</th> </tr> </thead> <tbody> <?php foreach ($data as $city => $pop): ?> <tr> <td><?= htmlspecialchars($city) ?></td> <td><?= $pop ?></td> </tr> <?php endforeach; ?> </tbody> </table>
补充说明
- 如果需要给人口数字加千分位分隔提升可读性,可以把输出人口的代码改成
<?= number_format($pop) ?> - 输出时加
htmlspecialchars()是为了避免城市名里的特殊字符导致HTML解析异常,属于通用安全写法 - 加了文件打开成功的判断,避免文件不存在时抛出致命错误
内容的提问来源于stack exchange,提问作者Stuxnet
相关产品推荐
相关产品推荐

