You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP读取文本生成城市人口关联数组排序输出表格报错修复

问题根因

你遇到的报错和逻辑错误来自4个核心问题:

  • 行拆分逻辑错误:用explode(' ', $row)按单个空格拆分内容,无法处理城市名和人口之间的多个制表符/空格,也会把Sao Paulo、Mexico City这类带空格的多词城市名拆成多个独立元素,还会生成大量空数组项。
  • 无意义的点拆分逻辑:你的数据里城市名根本不存在.字符,explode('.', $data[$index][0])这步完全多余,会破坏原有数据结构。
  • 空行未过滤:文件末尾通常会有换行,feof()会读到最后空行,空行拆分后不存在索引1的元素,直接触发你看到的Undefined array key 1警告。
  • 数组结构不符合需求:你没有按要求用城市名作为键、人口作为值构建关联数组,后续排序、表格输出的逻辑都基于错误的数组结构编写,甚至表格多写了一列单元格,和表头列数不匹配,自然输出异常。
修复方案

直接按需求重构逻辑即可,核心步骤:

  1. 读取每行时先过滤首尾空白,跳过空行
  2. 按任意数量的空白字符(空格、制表符)拆分每行,最后一个元素是人口数,前面所有元素拼接起来是完整城市名
  3. 构建城市为键、人口为整数值的关联数组
  4. 用arsort()按人口数降序排序(保留键值关联关系,不要用usort/sort,会丢失键名)
  5. 遍历关联数组输出表格,删除多余列
完整可运行代码
<?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:36:21