
本文详解如何正确读取含城市名与人口的纯文本文件,构建以城市为键、人口为值的关联数组,按人口降序排序,并以 html 表格规范输出结果。
本文详解如何正确读取含城市名与人口的纯文本文件,构建以城市为键、人口为值的关联数组,按人口降序排序,并以 html 表格规范输出结果。
实现该功能的关键在于:准确解析每行数据、正确构建关联数组、使用合适的排序函数、避免索引越界错误。原始代码存在多个核心问题:误用空格分割(实际数据间为多空格/制表符,非单空格)、错误调用 array_splice 和 explode('.', ...)(数据中并无点号分隔)、usort 后仍按数值索引访问导致 Undefined array key 警告,且最终表格输出逻辑与数组结构不匹配。
以下是优化后的完整解决方案:
<?php
// 1. 安全打开文件(建议添加错误检查)
$fileHandler = fopen("Info_array.txt", "r");
if (!$fileHandler) {
die("无法打开文件 Info_array.txt,请检查路径和权限。");
}
$data = [];
// 2. 逐行读取并解析
while (($row = fgets($fileHandler)) !== false) {
// 去除首尾空白并跳过空行
$row = trim($row);
if (empty($row)) continue;
// 使用正则匹配:城市名(非数字+非空白字符) + 一个或多个空白 + 人口数字
if (preg_match('/^([^\d\s]+)\s+(\d+)$/', $row, $matches)) {
$city = trim($matches[1]);
$population = (int)$matches[2];
$data[$city] = $population;
}
}
fclose($fileHandler);
// 3. 按人口值降序排序(保留键名)
arsort($data, SORT_NUMERIC);
?><table class="heavyTable" border="1" style="border-collapse: collapse; width: 100%;">
<thead>
<tr>
<th style="padding: 8px; text-align: left;">城市</th>
<th style="padding: 8px; text-align: right;">人口</th>
</tr>
</thead>
<tbody>
<?php foreach ($data as $city => $population): ?>
<tr>
<td style="padding: 8px;"><?= htmlspecialchars($city) ?></td>
<td style="padding: 8px; text-align: right;"><?= number_format($population) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>✅ 关键改进说明:
- 健壮解析:使用正则 /^([^\d\s]+)\s+(\d+)$/ 精准捕获城市名(不含数字和空格)与纯数字人口,避免空格分割带来的碎片化问题;
- 直接构建关联数组:$data[$city] = $population 天然满足“城市为键、人口为值”的需求,无需中间索引数组;
- 正确排序:arsort($data, SORT_NUMERIC) 按数值降序排列并保持键值关联,比 usort 更简洁安全;
- 安全输出:htmlspecialchars() 防止 XSS,number_format() 提升人口数字可读性;
- 错误防护:增加 fopen 失败判断与空行跳过逻辑,提升程序鲁棒性。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 确保 Info_array.txt 文件编码为 UTF-8(无 BOM),否则中文城市名可能乱码;
- 若文件中城市名含空格(如 “New York”),需调整正则为 /^([^\d\n]+?)\s+(\d+)$/ 并配合 trim() 处理;
- 生产环境建议改用 file() + array_map() 或 SplFileObject 实现更优雅的流式处理。
此方案逻辑清晰、容错性强,完全符合题目要求,可直接运行并稳定输出结构化表格。



















