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 提供上百个数组函数,挑几个高频且易混淆的说明: