php数组是哈希表实现的有序映射,兼具索引与关联特性;支持短语法创建、count/is_array/array_key_exists等关键操作及foreach遍历,本质理解可避免常见错误。

PHP 数组是开发中最常用、最核心的数据结构之一,掌握其本质和用法是写出清晰、健壮代码的基础。它不是简单的“值的集合”,而是一个灵活的有序映射(ordered map),既能当索引数组用,也能当关联数组用,还能嵌套、动态增删、支持多种遍历方式。
数组的两种基本类型:索引数组与关联数组
PHP 中没有独立的“关联数组”类型,所有数组都是 哈希表实现的有序映射,区别只在于键(key)的类型和来源:
-
索引数组:键为整数,通常从 0 开始自动递增(如
['a', 'b', 'c']等价于[0=>'a', 1=>'b', 2=>'c']);array_push()、[]追加会自动分配下一个整数键。 -
关联数组:键为字符串或整数,由开发者显式指定(如
['name' => 'Tom', 'age' => 25]);键名可含空格、特殊字符(需加引号),但建议用合法标识符。 - 两者可混合存在(如
[0=>'first', 'key'=>'value', 2=>'third']),但不推荐,易引发逻辑混淆。
创建与初始化的常见方式
数组可通过多种语法创建,语义一致,选择取决于可读性与上下文:
-
短数组语法(推荐):
$arr = [];或$arr = ['a', 'b'];或$arr = ['name'=>'Tom', 'score'=>95]; -
array() 函数(PHP 5.4 前必需,现仍可用):
$arr = array('a', 'b');或$arr = array('name'=>'Tom'); -
动态构建:先声明空数组
$arr = [];,再通过$arr[] = 'new';或$arr['key'] = 'val';赋值。 -
函数生成:
range(1,5)、str_split('abc')、explode(',', $str)等返回数组,直接赋值即可。
常用操作与关键细节
操作数组时,需注意底层行为和边界情况,避免隐式错误:
立即学习“PHP免费学习笔记(深入)”;
-
获取长度:用
count($arr),不是sizeof()(后者是别名,不推荐);对空数组返回 0,对非数组返回 1(慎用于未校验变量)。 -
判断是否为数组:必须用
is_array($var),不能用isset($var)或!empty($var)替代。 -
检查键是否存在:用
array_key_exists('key', $arr)(包括null值);isset($arr['key'])仅当键存在且值不为null时为真。 -
安全取值(避免 Notice):推荐三元判断
$val = $arr['key'] ?? 'default';(PHP 7+),或封装工具函数。 -
删除元素:用
unset($arr['key']),不会重排索引;需重排用$arr = array_values($arr)。
遍历与常用内置函数
遍历方式应匹配使用场景,函数选择要明确副作用(是否修改原数组、是否保留键):
-
foreach 最常用:
foreach ($arr as $key => $value)安全高效,不改变内部指针;无需担心键类型,自动适配索引/关联。 - while + each() 已废弃(PHP 7.2+ 移除),请改用 foreach 或 for(仅限纯索引数组)。
-
常用函数速查:
-
array_merge($a, $b):合并数组,关联键覆盖,数字键重排;+运算符是键不覆盖的“左优先”合并。 -
in_array($val, $arr, true):第三个参数设true启用严格比较(推荐)。 -
array_keys($arr, $search)/array_values($arr):分别提取键或值,常用于转换。 -
array_filter($arr, $callback):过滤,返回新数组;默认保留“truthy”值,可传回调自定义逻辑。 -
array_map($callback, $arr):映射变换,返回新数组;注意多维需递归处理。
-
理解数组的本质是“有序映射”,而不是“类列表容器”,就能自然区分何时用索引、何时用关联、何时该检查键存在、何时需重排。熟练运用 ??、is_array()、array_key_exists() 和 foreach,能避开绝大多数低级错误。不复杂但容易忽略。











