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

PHP 数组是语言中最核心、最灵活的数据类型,它既是普通列表,也能模拟栈、队列、哈希表甚至树的结构。理解它的底层逻辑和常见用法,比死记函数更重要。
索引数组与关联数组:本质都是哈希表
PHP 中没有真正意义上的“索引数组”或“关联数组”之分,所有数组底层都是有序哈希表(ordered hash table)。所谓“索引数组”,只是键为连续整数(0,1,2…)的特例;所谓“关联数组”,只是键为字符串或非连续整数的常见形式。
这意味着:
- 你可以混用键类型:
$arr = [0 => 'a', 'name' => 'Tom', 2 => 'c']是完全合法的 -
count()返回元素个数,不是最大下标;array_keys($arr)能看到所有键,包括字符串键 - 遍历时(如
foreach),顺序始终按插入顺序,与键是否数字无关
常用数据结构的原生实现方式
PHP 数组足够通用,无需额外类库就能高效模拟多种结构:
基于Intranet/Internet 的Web下的办公自动化系统,采用了当今最先进的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()默认过滤掉false、0、""、null等“空值”,若需保留0或false,加第三个参数ARRAY_FILTER_USE_BOTH并自定义回调 -
array_map()和array_walk()区别:前者返回新数组,后者直接修改原数组(需传引用);array_walk()支持多维递归(用ARRAY_WALK_RECURSIVE)










