PHP 数组基础概念与常见数据结构详解

3次阅读

php数组本质是有序哈希表,索引与关联数组无底层区别;可原生实现、队列、集合、映射等结构;遍历时修改需谨慎,推荐引用或延后操作。

PHP 数组基础概念与常见数据结构详解

PHP 数组是语言中最核心、最灵活的数据类型,它既是普通列表,也能模拟栈、队列、哈希表甚至树的结构。理解它的底层逻辑和常见用法,比死记函数更重要。

索引数组与关联数组:本质都是哈希表

PHP 中没有真正意义上的“索引数组”或“关联数组”之分,所有数组底层都是有序哈希表(ordered hash table)。所谓“索引数组”,只是键为连续整数(0,1,2…)的特例;所谓“关联数组”,只是键为字符串或非连续整数的常见形式。

这意味着:

  • 你可以混用键类型:$arr = [0 => 'a', 'name' => 'Tom', 2 => 'c'] 是完全合法的
  • count() 返回元素个数,不是最大下标;array_keys($arr) 能看到所有键,包括字符串键
  • 遍历时(如 foreach),顺序始终按插入顺序,与键是否数字无关

常用数据结构的原生实现方式

PHP 数组足够通用,无需额外类库就能高效模拟多种结构:

立即学习PHP免费学习笔记(深入)”;

  • 栈(LIFO):用 array_push() 入栈,array_pop() 出栈
  • 队列(FIFO):用 array_push() 入队,array_shift() 出队(注意 shift 效率略低,大数据量可考虑 array_unshift() + array_pop() 反向操作)
  • 集合(去重):用 array_unique() 去重,array_values() 重置索引;判断存在用 in_array()(小数组)或 array_key_exists()(转成键后查,更快)
  • 映射表(字典):直接用关联数组,如 $map['user_123'] = ['name' => 'Alice', 'age' => 30],查值即 $map['user_123']['name']

遍历与修改的关键细节

遍历时稍不注意就容易出错,尤其涉及修改:

  • foreach ($arr as $k => $v) 是值拷贝,修改 $v 不影响原数组;要改原值,需用引用:foreach ($arr as $k => &$v),用完记得 unset($v) 避免意外覆盖
  • foreach 中增删元素,行为未定义——可能跳过元素或重复遍历;安全做法是先收集待操作键,循环结束后统一处理
  • for 遍历索引数组时,注意 count() 在循环内调用有性能开销,建议提前缓存:$len = count($arr); for ($i = 0; $i

数组函数选型建议

PHP 提供上百个数组函数,挑几个高频且易混淆的说明:

  • array_merge():只合并数值键(会重排索引),字符串键冲突时后者覆盖前者;如需保留所有键且不覆盖,用 + 运算符(左操作数优先)
  • array_filter() 默认过滤掉 false0""NULL 等“空值”,若需保留 0false,加第三个参数 ARRAY_FILTER_USE_BOTH 并自定义回调
  • array_map()array_walk() 区别:前者返回新数组,后者直接修改原数组(需传引用);array_walk() 支持多维递归(用 ARRAY_WALK_RECURSIVE
text=ZqhQzanResources