PHP 数组中文讲解
- PHP 数组是一种可以存储多个值的特殊变量,适合用于列表、字典等多种用途。
- 数组有数值数组(用数字索引)、关联数组(用指定键)和多维数组(嵌套数组)三种类型。
- 可以用
array()
或 []
创建数组,访问和修改通过键名完成。 - 常用函数如
count()
(计算长度)、array_merge()
(合并数组)等,方便操作。
PHP 数组是一种数据结构,可以在单个变量中存储多个值。它类似于列表或字典,灵活性高,支持数值索引和自定义键名。数组可以用来管理数据,如用户列表、商品信息等。
- 创建数组:用
array()
或 []
创建,例如:- 数值数组:
$cars = array("Volvo", "BMW");
或 $cars = ["Volvo", "BMW"];
- 关联数组:
$age = array("Peter" => "35", "Ben" => "37");
- 访问和修改:用
$array[key]
访问,例如 $cars[0]
获取第一个元素;用 $array[key] = value
修改。 - 遍历数组:用
for
循环遍历数值数组,用 foreach
遍历关联数组。
count($array)
:返回数组长度。array_merge($array1, $array2)
:合并多个数组。array_filter()
:过滤数组元素。
本文将全面讲解 PHP 数组的定义、类型、创建方法、访问与修改、遍历方式、常用函数以及实用技巧,旨在为学习者提供系统化的中文讲解。以下内容基于权威资源和实践经验,适合不同水平的 PHP 开发者。
PHP 数组是一种特殊变量,能够在单个变量中存储多个值。它本质上是一个有序映射(ordered map),将值(values)关联到键(keys)。这种结构在 PHP 中高度优化,可用于多种场景,如列表(vector)、哈希表(hash table)、字典(dictionary)、集合(set)、栈(stack)、队列(queue)等。由于数组的值可以是其他数组,PHP 支持树形结构和多维数组。
- 使用
array()
语言结构或短语法 []
。 - 语法:
array(key => value, key2 => value2, ...)
或 [key => value, ...]
。 - 键(key)可以是整数(integer)或字符串(string),值(value)可以是任意类型。
- 示例:
$arr = array(1 => "apple", 2 => "banana");
$arr = ["apple", "banana"];
- 单行数组定义中,最后一个逗号可以省略,例如
array(1, 2)
。 - 多行数组定义通常保留最后一个逗号,便于添加新元素。
- 数值数组(Numeric Array):键是数字,从 0 开始自动递增。
- 示例:
$cars = array("Volvo", "BMW", "Toyota");
- 关联数组(Associative Array):键是用户指定的字符串或整数。
- 示例:
$age = array("Peter" => "35", "Ben" => "37", "Joe" => "43");
- 多维数组(Multidimensional Array):数组中包含其他数组,形成嵌套结构。
- 示例:
$multi = array(array(1, 2), array(3, 4));
- 键可以是整数或字符串,PHP 会根据需要进行类型转换:
- 字符串如 “8” 会转换为整数,除非以 “+” 开头。
- 浮点数如 8.7 会截断为 8。
- 布尔值 true 转换为 1,false 转换为 0。
- null 转换为空字符串 “”。
- 数组和对象不能作为键,会引发 “Illegal offset type” 警告。
- 如果多个元素使用相同键,最后一个键值对会覆盖之前的。例如:
$arr = array(1 => "a", 1 => "b");
结果只有 “b”,键 1 被覆盖。
- 如果未指定键,PHP 会使用最高前一个整数键 + 1,初始从 0 开始。
- 示例:
$arr = array("foo", "bar");
结果键为 0, 1。
- 负索引(PHP 8.3.0 之前):赋值负整数键 n 时,下一个键从 0 开始。
- 示例:
$arr[-5] = 1; $arr[] = 2;
在 8.3.0 之前结果为 [-5]=>1, [0]=>2
,8.3.0 后为 [-5]=>1, [-4]=>2
。
- 访问:使用
$array[key]
语法。例如:$cars[0]
获取第一个元素。- 支持嵌套访问,如
$array["multi"]["dimensional"]["array"]
。
- 修改:用
$array[key] = value
修改,或用 $array[] = value
添加新元素(自动分配键)。- 示例:
$arr[] = 56;
等同于 $arr[13] = 56
,如果 12 是最高键。
- 从 PHP 7.1.0 开始,对字符串应用空索引运算符
[]
会引发致命错误。 - 从 PHP 8.1.0 开始,从
false
创建数组被弃用,但从 null
或未定义变量创建数组仍允许。
从 PHP 7.1.0 开始,支持数组解构,使用 []
或 list()
将数组元素分配给变量:
- 示例:
[$foo, $bar, $baz] = $source_array;
将元素分配给变量。[, , $baz] = $source_array;
忽略前两个元素,只赋值索引 2。- 支持关联数组:
['baz' => $three] = $source_array;
赋值 ‘baz’ 的值。
list()
仅适用于数值索引数组。
- 数值数组:使用
for
循环,结合 count()
获取长度。 - 关联数组:使用
foreach
循环。- 示例:
$age = array("Peter" => "35", "Ben" => "37", "Joe" => "43");
foreach ($age as $x => $x_value) {
echo "Key: $x, Value: $x_value\n";
}
PHP 提供了丰富的数组函数,以下是部分常用函数及其用途:
函数名 | 功能描述 | 示例 |
---|
count() | 返回数组长度 | echo count($cars); // 输出 3 |
array_values() | 返回数组值,重新索引 | $new = array_values($arr); |
array_keys() | 返回数组键 | $keys = array_keys($arr); |
array_merge() | 合并多个数组,后者覆盖前者同名键 | $merged = array_merge($arr1, $arr2); |
array_filter() | 过滤数组元素,使用回调函数 | $filtered = array_filter($arr, 'callback'); |
array_map() | 对每个元素应用回调函数 | $mapped = array_map('trim', $arr); |
array_walk() | 对每个元素应用回调函数,修改原数组 | array_walk($arr, 'callback'); |
array_unique() | 返回唯一值,保留键 | $unique = array_unique($arr); |
array_column() | 从多维数组提取特定列 | $column = array_column($multi, 'id'); |
array_sum() | 计算数组所有值的总和 | echo array_sum($arr); |
array_product() | 计算数组所有值的乘积 | echo array_product($arr); |
- 组合使用函数:例如
array_filter(array_map('trim', $values))
可同时修剪和过滤空字符串。 - 键冲突处理:注意同名键会被覆盖,需确保键的唯一性。
- 性能优化:对于大数组,尽量使用内置函数如
array_reduce()
而非手动循环。 - 示例组合:
array_count_values($letters); arsort($values); array_slice($values, 0, 3)
:找出前三个最频繁的元素。array_sum(array_map(function($product_row) { return $product_row['price'] * $product_row['count']; }, $order))
:计算订单总价。
- 总是为字符串键加引号,避免语法错误。
- 使用
unset()
删除元素后,数组可能出现空隙,可用 array_values()
重新索引。 - 注意版本差异,如负索引在 PHP 8.3.0 的行为变化。
这些资源涵盖基础到高级的知识,适合初学者和有经验的开发者参考。