
本文介绍如何用 php 正确读取含城市名与人口的文本文件,构建以城市为键、人口为值的关联数组,按人口数值降序排序,并以 html 表格格式规范输出。
本文介绍如何用 php 正确读取含城市名与人口的文本文件,构建以城市为键、人口为值的关联数组,按人口数值降序排序,并以 html 表格格式规范输出。
在实际开发中,从纯文本文件解析结构化数据(如城市与人口)是常见需求。但原始代码存在多个关键问题:使用空格作为分隔符易因多空格或首尾空白导致 explode(' ', $row) 产生空元素;错误调用 array_splice 和 explode('.', ...) 完全偏离数据格式(示例中并无小数点);usort 后仍试图访问 $item[0]、$item[1]、$item[2],但此时数组结构已非预期的二维索引数组;且未过滤空行或清理换行符,直接导致“Undefined array key”警告。
正确实现的核心步骤如下:
- 安全读取文件:使用 file() 函数(自动处理换行)或 fgets() 配合 trim() 清理每行;
- 精准分割字段:观察示例数据,城市名与人口间实际由多个空格(或制表符)分隔,推荐使用 preg_split('/\s+/', $row, -1, PREG_SPLIT_NO_EMPTY) 确保健壮性(兼容空格/Tab/混合);
- 构建关联数组:直接 $data[$city] = (int)$population,避免冗余索引操作;
- 按值降序排序:arsort($data, SORT_NUMERIC) 显式指定数值排序,保留键名;
- 安全输出表格:使用 foreach ($data as $city => $pop) 直接解构键值对,杜绝下标越界。
✅ 推荐优化代码(含错误防护):
<?php
$filename = "Info_array.txt";
if (!file_exists($filename)) {
die("Error: File '{$filename}' not found.");
}
$data = [];
$lines = file($filename, 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]); // 强制转整型,防字符串干扰排序
if (!empty($city) && $population > 0) {
$data[$city] = $population;
}
}
}
// 按人口数值降序排列(大→小)
arsort($data, SORT_NUMERIC);
?>
<table class="heavyTable">
<thead>
<tr>
<th>City</th>
<th>Population</th>
</tr>
</thead>
<tbody>
<?php foreach ($data as $city => $pop): ?>
<tr>
<td><?= htmlspecialchars($city, ENT_QUOTES, 'UTF-8') ?></td>
<td><?= number_format($pop) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>关键改进说明:
立即学习“PHP免费学习笔记(深入)”;
- 使用 file() + FILE_SKIP_EMPTY_LINES 自动跳过空行;
- preg_split('/\s+/'...) 精准匹配任意空白分隔符,避免空元素;
- (int)trim($parts[1]) 确保人口为整数,arsort(..., SORT_NUMERIC) 保障数值正确排序;
- htmlspecialchars() 防止 XSS(若城市名含特殊字符);
- number_format($pop) 提升可读性(如 39105000 → 39,105,000)。
⚠️ 注意事项:确保文本文件编码为 UTF-8;若数据含逗号分隔或引号包裹,请改用 str_getcsv();生产环境务必添加异常捕获与日志记录。此方案简洁、健壮、符合 PHP 最佳实践。



















