
本文介绍如何用 php 正确读取包含城市名与人口的文本文件,构建以城市为键、人口为值的关联数组,按人口数值降序排序,并以 html 表格形式规范输出。
本文介绍如何用 php 正确读取包含城市名与人口的文本文件,构建以城市为键、人口为值的关联数组,按人口数值降序排序,并以 html 表格形式规范输出。
要实现从文本文件中提取城市与人口数据、构建成键值对数组、按人口排序并渲染为 HTML 表格,关键在于正确解析字段分隔符、避免空行干扰、使用合适的排序函数,以及采用语义清晰的关联数组结构。
首先需明确:示例数据实际以多个空格(或制表符)分隔,而非单个空格或点号(.)。原代码中误用 explode(' ', $row) 会导致因连续空格产生大量空数组元素;更严重的是 array_splice(... explode('.', ...)) 完全偏离需求——原始数据中根本不存在 . 分隔符,此操作不仅无效,还会破坏数组结构,最终引发 Undefined array key 1 等 Notice 错误。
✅ 正确做法如下:
- 安全读取文件:使用 file() 函数(自动处理换行、忽略空行)比 fopen + fgets + feof 更简洁可靠;若坚持流式读取,务必过滤空行和空白字符。
- 精准分割字段:观察数据格式(如 Tokyo 39105000),推荐使用 preg_split('/\s+/', trim($row)) 按任意空白符分割,并剔除首尾空格,确保获得 [city, population] 两元素数组。
- 构建关联数组:直接 $data[$city] = (int)$population,既明确语义,又便于后续排序。
- 按人口值降序排序:使用 arsort($data, SORT_NUMERIC) —— arsort 保留键名,SORT_NUMERIC 确保按数值而非字符串比较(避免 "22495000" 被当作字符串排在 "31870000" 前)。
- 安全输出表格:遍历 $data as $city => $pop,避免索引越界风险。
以下是优化后的完整可运行代码:
<?php // 读取文件并构建关联数组(城市 => 人口)
$data = [];
$lines = file('Info_array.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
$parts = preg_split('/\s+/', trim($line), -1, PREG_SPLIT_NO_EMPTY);
if (count($parts) >= 2) {
$city = trim($parts[0]);
$population = (int)trim($parts[1]);
$data[$city] = $population;
}
}
// 按人口数值降序排序(保留键名)
arsort($data, SORT_NUMERIC);
?>
| City | Population |
|---|---|
| = htmlspecialchars($city) ?> | = number_format($pop) ?> |
? 注意事项:
- 使用 htmlspecialchars($city) 防止 XSS(若城市名含 HTML 特殊字符);
- number_format($pop) 提升可读性(如 39,105,000);
- FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES 确保跳过空行和换行符;
- PREG_SPLIT_NO_EMPTY 避免因多余空格产生空元素;
- 强制 (int) 类型转换可过滤非数字干扰,增强健壮性。
该方案逻辑清晰、容错性强,完全满足“城市为键、人口为值、按人口排序、表格化输出”的核心需求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











