PHP 数组

PHP 数组中文讲解

关键点

  • PHP 数组是一种可以存储多个值的特殊变量,适合用于列表、字典等多种用途。
  • 数组有数值数组(用数字索引)、关联数组(用指定键)和多维数组(嵌套数组)三种类型。
  • 可以用 array() 或 [] 创建数组,访问和修改通过键名完成。
  • 常用函数如 count()(计算长度)、array_merge()(合并数组)等,方便操作。

什么是 PHP 数组

PHP 数组是一种数据结构,可以在单个变量中存储多个值。它类似于列表或字典,灵活性高,支持数值索引和自定义键名。数组可以用来管理数据,如用户列表、商品信息等。

如何创建和使用

  • 创建数组:用 array() 或 [] 创建,例如:
    • 数值数组:$cars = array("Volvo", "BMW"); 或 $cars = ["Volvo", "BMW"];
    • 关联数组:$age = array("Peter" => "35", "Ben" => "37");
  • 访问和修改:用 $array[key] 访问,例如 $cars[0] 获取第一个元素;用 $array[key] = value 修改。
  • 遍历数组:用 for 循环遍历数值数组,用 foreach 遍历关联数组。

常用功能

PHP 提供许多数组函数,例如:

  • count($array):返回数组长度。
  • array_merge($array1, $array2):合并多个数组。
  • array_filter():过滤数组元素。

更多详情可参考:


详细报告

本文将全面讲解 PHP 数组的定义、类型、创建方法、访问与修改、遍历方式、常用函数以及实用技巧,旨在为学习者提供系统化的中文讲解。以下内容基于权威资源和实践经验,适合不同水平的 PHP 开发者。

1. PHP 数组概述

PHP 数组是一种特殊变量,能够在单个变量中存储多个值。它本质上是一个有序映射(ordered map),将值(values)关联到键(keys)。这种结构在 PHP 中高度优化,可用于多种场景,如列表(vector)、哈希表(hash table)、字典(dictionary)、集合(set)、栈(stack)、队列(queue)等。由于数组的值可以是其他数组,PHP 支持树形结构和多维数组。

2. 数组的定义与创建

数组可以通过以下方式创建:

  • 使用 array() 语言结构或短语法 []
  • 语法:array(key => value, key2 => value2, ...) 或 [key => value, ...]
  • 键(key)可以是整数(integer)或字符串(string),值(value)可以是任意类型。
  • 示例:
    • $arr = array(1 => "apple", 2 => "banana");
    • $arr = ["apple", "banana"];

注意:

  • 单行数组定义中,最后一个逗号可以省略,例如 array(1, 2)
  • 多行数组定义通常保留最后一个逗号,便于添加新元素。

3. 数组的类型

PHP 数组主要分为三种类型:

  • 数值数组(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));

4. 键的类型与冲突

  • 键可以是整数或字符串,PHP 会根据需要进行类型转换:
    • 字符串如 “8” 会转换为整数,除非以 “+” 开头。
    • 浮点数如 8.7 会截断为 8。
    • 布尔值 true 转换为 1,false 转换为 0。
    • null 转换为空字符串 “”。
    • 数组和对象不能作为键,会引发 “Illegal offset type” 警告。
  • 如果多个元素使用相同键,最后一个键值对会覆盖之前的。例如:
    • $arr = array(1 => "a", 1 => "b"); 结果只有 “b”,键 1 被覆盖。

5. 自动索引与负索引

  • 如果未指定键,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

6. 数组的访问与修改

  • 访问:使用 $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或未定义变量创建数组仍允许。

7. 数组解构

从 PHP 7.1.0 开始,支持数组解构,使用 [] 或 list() 将数组元素分配给变量:

  • 示例:
    • [$foo, $bar, $baz] = $source_array; 将元素分配给变量。
    • [, , $baz] = $source_array; 忽略前两个元素,只赋值索引 2。
    • 支持关联数组:['baz' => $three] = $source_array; 赋值 ‘baz’ 的值。
  • list() 仅适用于数值索引数组。

8. 数组的遍历

  • 数值数组:使用 for 循环,结合 count() 获取长度。
    • 示例:
      $cars = array("Volvo", "BMW", "Toyota");
      for ($i = 0; $i < count($cars); $i++) {
      echo $cars[$i] . "\n";
      }
  • 关联数组:使用 foreach 循环。
    • 示例:
      $age = array("Peter" => "35", "Ben" => "37", "Joe" => "43");
      foreach ($age as $x => $x_value) {
      echo "Key: $x, Value: $x_value\n";
      }

9. 常用数组函数

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);

更多函数可参考 PHP 官方手册 – 数组函数

10. 实用技巧与最佳实践

  • 组合使用函数:例如 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)):计算订单总价。

11. 常见误区

  • 总是为字符串键加引号,避免语法错误。
  • 使用 unset() 删除元素后,数组可能出现空隙,可用 array_values() 重新索引。
  • 注意版本差异,如负索引在 PHP 8.3.0 的行为变化。

12. 参考资源

以下是中文资源,提供更详细的 PHP 数组讲解:

这些资源涵盖基础到高级的知识,适合初学者和有经验的开发者参考。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注