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' 这样的字符串。一个数组甚至可以混合使用两种键。