Menu

PHP 多维数组:嵌套数组与遍历

PHP 多维数组是元素本身也是数组的数组,每一层用一对方括号读取:$grid[1][2] 或 $users[0]['name']。学习如何创建嵌套数组、读取和修改深层的值、用嵌套 foreach 遍历、生成 HTML 表格、取出一列以及对行排序。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

多维数组是元素本身也是数组的数组。每一层用一对方括号读取:$grid[1][2] 是第 1 行第 2 列,$users[0]['name'] 是第一条记录中的名字。

第二种形式,即由带命名字段的记录组成的列表,是你最常遇到的:数据库查询、解码后的 JSON 响应或解析后的 CSV 文件通常给你的就是它。每条记录都是一个 关联数组。

创建嵌套数组

嵌套可以按需要任意加深,各层也可以混用数字键和字符串键。配置数组是一个常见的例子:一些有名字的部分,每部分包含若干设置或列表。

添加行和嵌套的值

$rows[] = [...] 追加一整行。$arr['key'][] = $value 在嵌套的列表中追加,第一次时 PHP 会自动创建内层数组,所以给值分组不需要任何准备工作。

遍历多维数组

每一层用一个 foreach。对于由记录组成的列表,一个循环通常就够了,因为你会按名称读取字段。对于网格,内层循环会依次访问每一行中的单元格。

用数组生成 HTML 表格

由行组成的数组可以直接对应到 HTML 表格:第一行的键成为表头,每一行成为一个 <tr>。运行后,“页面”标签页会显示渲染出来的表格;修改一个值或添加一行,再运行一次。

foreach (...): ... endforeach; 这种写法是专为模板准备的同一种循环,能让 HTML 保持可读。

从所有行中取出一列

array_column() 把每一行中的某个字段取出来,组成一个扁平的列表。传入第三个参数可以用另一个字段作为结果的键,这样就把记录列表变成了一张查找表。

按字段对行排序

usort() 用一个比较函数对行进行排序。太空船运算符 <=> 返回 -1、0 或 1,这正是 usort() 所期望的。交换 $a 和 $b 即可按降序排序。

count($players, COUNT_RECURSIVE) 会统计 3 行再加上其中的 6 个字段,所以打印的是 9。

常见错误:读取可能不存在的深层键

在没有 cache 键的情况下读取 $config['cache']['ttl'],会先打印 Warning: Undefined array key "cache",接着下一层还会打印 Warning: Trying to access array offset on null。?? 运算符会一次性检查整条链,而且从不警告,所以它是读取可选嵌套值的安全方法。

常见问题

PHP 中怎么访问多维数组中的值?

每一层加一对方括号:$matrix[1][0] 是第 1 行第 0 列,$users[0]['email'] 是第一个用户的邮箱。每对方括号都从前一对方括号返回的数组中读取。

PHP 中怎么遍历多维数组?

每一层嵌套一个 foreach:foreach ($rows as $row) { foreach ($row as $key => $value) { ... } }。对于由记录组成的数组,通常只需要一个循环,然后按名称读取字段:$row['name']。

怎么向多维数组中添加元素?

用 $rows[] = ['name' => 'Linus', 'age' => 54]; 追加一整行,或者用 $groups['admins'][] = 'Grace'; 在嵌套数组中追加。如果这个键还不存在,PHP 会自动创建内层数组。

PHP 中怎么创建一个全是 0 的二维数组?

嵌套两次 array_fill() 调用:$grid = array_fill(0, 3, array_fill(0, 4, 0)); 得到 3 行、每行 4 个 0。每一行都是独立的副本,所以 $grid[0][0] = 5; 只会修改第一行。

Coddy 编程语言插图

和 Coddy 一起学编程

开始