Menu

PHP 数组:创建、访问、遍历和输出

PHP 数组是一个有序的值列表,每个值都保存在一个键下:$fruits = ['apple', 'banana']; 用 $fruits[0] 读取。学习如何创建数组、读取和修改元素、遍历数组、输出数组,以及该用哪个数组函数。

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

PHP 数组在键下保存一组值。用方括号创建一个数组 $fruits = ['apple', 'banana', 'cherry'];,再通过索引读取元素 $fruits[0]。索引从 0 开始,count($fruits) 返回元素的个数。

每个 PHP 数组都是一个有序映射:每个值都位于一个键下。如果你不指定键,PHP 会把它们编号为 0, 1, 2...,这样得到的是索引数组。如果你自己指定键(['name' => 'Ada']),得到的就是关联数组。两者都是同一种 array 类型。

创建数组

方括号是常用的语法。array() 是较旧的写法,生成的结果完全相同。range() 生成一个数字或字母的列表,array_fill() 则重复同一个值。

一个 PHP 数组可以同时保存不同类型的值,包括其他数组。由数组组成的数组就是多维数组,这是保存多行数据的常用方式。

获取第一个和最后一个元素

PHP 没有负数索引。$arr[-1] 的意思不是“最后一个”:它会查找名为 -1 的键,如果不存在,PHP 会输出 Warning: Undefined array key -1。请使用 array_key_first() 和 array_key_last(),它们在键不从 0 开始时也能正常工作。

end($queue) 也能返回最后一个值,但它有一个副作用:会移动数组的内部指针,所以基于键的写法更清楚。

输出数组

echo $arr 行不通:它会输出单词 Array 和一条警告。根据用途选择合适的输出方式:

  • 调试时用 print_r($arr) 得到易读的输出。
  • 用 var_dump($arr) 还能看到每个值的类型和长度。
  • 用 implode(', ', $arr) 把所有值变成一个字符串用于显示。
  • 用 json_encode($arr) 把数组发送给 JavaScript 或 API。

print_r 和 var_dump 页面介绍了各种格式选项,包括在 HTML 中输出数组。

遍历数组

foreach 是专为数组设计的循环:它把每个值交给你,需要的话也会给出键。对于键从 0 开始且没有空缺的索引数组,带索引的 for 循环同样可用。

数组是复制的,而不是共享的

把数组赋给另一个变量,或者把它传给函数,得到的是一份副本。修改副本不会影响原数组。如果函数需要修改调用方的数组,就在参数前加上 &。

按任务分类的数组函数

PHP 自带 70 多个数组函数。下面这些是最常用的,每个都有单独的页面:

任务函数
添加到末尾array_push() 或 $arr[] =
元素个数count()
检查值是否存在in_array()
查找值对应的键array_search()
检查键是否存在array_key_exists()
合并数组array_merge()
转换每个值array_map()
保留部分值array_filter()
排序sort()、usort() 等
删除元素unset()、array_splice()
截取一部分array_slice()
删除重复值array_unique()
字符串和数组互相转换explode()、implode()

会悄悄合并的键

数组的键要么是整数,要么是字符串,而 PHP 会替你转换某些键。看起来像十进制整数的字符串(比如 "1")会变成整数 1,所以 $a["1"] 和 $a[1] 是同一个位置。"01" 和 "1.5" 则仍然是字符串。这就是为什么用表单输入或 CSV 构建的数组,元素可能比你预期的少。

常见问题

PHP 中怎样创建数组?

使用方括号:$colors = ['red', 'green', 'blue'];。空数组写作 $items = [];。旧的 array('red', 'green') 语法效果完全相同,现在也仍然可用。

PHP 中怎样输出数组?

echo 不能输出数组(它会输出单词 Array 和一条警告)。用 print_r($arr) 得到易读的输出,用 var_dump($arr) 还能看到类型,或者用 echo implode(', ', $arr) 把所有值输出成一行。

PHP 中怎样获取数组的最后一个元素?

使用 $arr[array_key_last($arr)](PHP 7.3+)或 end($arr)。PHP 没有负数索引:$arr[-1] 会去查找名为 -1 的键,而这个键通常并不存在。

PHP 数组是按值传递还是按引用传递?

按值传递。$b = $a; 会给 $b 一份自己的副本,所以修改 $b 不会改变 $a。如果要在函数内部修改调用方的数组,就把参数声明为引用:function add(array &$list)。

PHP 中的索引数组和关联数组有什么区别?

它们是同一种类型。索引数组的键是 PHP 自动分配的整数 0, 1, 2...;关联数组使用你自己选择的键,通常是像 'name' 这样的字符串。一个数组甚至可以混合使用两种键。

Coddy 编程语言插图

和 Coddy 一起学编程

开始