← PHP索引数组:用数字下标管理有序数据列表 PHP多维数组:用嵌套结构处理表格与层级数据 →

PHP关联数组:用有意义的键名替代数字索引

原创 2026-05-09 PHP 已有人查阅

上一节我们讲的索引数组用0、1、2这样的数字做键名。这种结构适合存有序列表,但有个明显的局限:过一段时间再回来看代码,你大概率想不起来$user[2]到底代表什么。是年龄?是城市?还是邮箱?

关联数组解决了这个问题。它允许你用自定义的字符串作为键名,给每个值贴上一个有含义的标签。$user["邮箱"]$user[2]直观得多——键名本身就是文档,读代码的人不需要去猜测每个位置存的是什么。

关联数组在PHP开发里使用频率很高。数据库查询结果、配置文件、API返回的JSON数据,落地到PHP里基本都是以关联数组的形式存在的。把关联数组的用法掌握扎实,日常编码会顺畅不少。

两种定义关联数组的方式

和索引数组一样,关联数组也有两种创建方式。=>符号(双箭头操作符)是定义键值对的关键,左边写键名,右边写对应的值。

方式一:用array()函数或短数组语法一次性声明

// 传统写法
$employeeSalary = array(
    "张伟" => 35000,
    "李娜" => 42000,
    "王磊" => 28000
);

// PHP 5.4+ 短数组语法(功能和上面一样)
$employeeSalary = [
    "张伟" => 35000,
    "李娜" => 42000,
    "王磊" => 28000
];

多个键值对用逗号分隔,结构一目了然。适合在初始化时就明确所有数据项的场景。

方式二:逐个键名手动赋值

$employeeSalary["张伟"] = 35000;
$employeeSalary["李娜"] = 42000;
$employeeSalary["王磊"] = 28000;

这种方式在运行时逐步填充数据时比较灵活。典型场景是从数据库循环读取记录,然后逐条写入数组。

关联数组的基本操作实例

实例1:通过键名访问具体值

<?php
$userInfo = array(
    "姓名" => "张明",
    "年龄" => 28,
    "城市" => "广州",
    "邮箱" => "alan@ebingou.cn"
);

echo "用户姓名:" . $userInfo["姓名"] . "<br/>";
echo "所在城市:" . $userInfo["城市"] . "<br/>";
echo "联系邮箱:" . $userInfo["邮箱"] . "<br/>";
?>

输出:

用户姓名:张明
所在城市:广州
联系邮箱:alan@ebingou.cn

$数组名['键名']取出指定键对应的值。键名用引号括起来,单引号或双引号都可以,保持一致就行。

实例2:存储学生成绩

<?php
$studentGrade = array("赵阳" => "A", "钱进" => "B", "孙月" => "C");

echo "赵阳的等级:" . $studentGrade["赵阳"] . "<br/>";
echo "钱进的等级:" . $studentGrade["钱进"] . "<br/>";
echo "孙月的等级:" . $studentGrade["孙月"] . "<br/>";
?>

输出:

赵阳的等级:A
钱进的等级:B
孙月的等级:C

学生姓名作为键,成绩作为值。如果你用索引数组存同样的数据,就得记住索引0是赵阳、索引1是钱进,很容易搞混。关联数组通过有意义的键名让这种顾虑自然消失。

实例3:存储国家和首都的对应关系

<?php
$capitalMap = array(
    "我国"   => "北京",
    "法国"   => "巴黎",
    "日本"   => "东京",
    "澳大利亚" => "堪培拉"
);

echo "我国的首都是:" . $capitalMap["我国"] . "<br/>";
echo "日本的首都是:" . $capitalMap["日本"] . "<br/>";
?>

输出:

我国的首都是:北京
日本的首都是:东京

这种“名称到名称”的映射关系,用关联数组来表达是比较自然的。

遍历关联数组:用foreach同时拿到键和值

关联数组用foreach遍历时,用$数组名 as $键变量 => $值变量这种语法,可以同时拿到键名和对应的值。

<?php
$productPrice = array(
    "笔记本" => 5999,
    "手机"   => 3999,
    "平板"   => 2499,
    "耳机"   => 899
);

echo "商品价格清单:<br/>";
foreach ($productPrice as $product => $price) {
    echo "{$product}——¥{$price}<br/>";
}
?>

输出:

商品价格清单:
笔记本——¥5999
手机——¥3999
平板——¥2499
耳机——¥899

每次循环,$product拿到当前的键名(如"笔记本"),$price拿到当前的值(如5999)。变量名叫什么都可以,但建议起得有含义,比如$product$price这样一看就知道是什么的变量名。

实用例子:输出可读性高的描述语句

<?php
$fruitColor = array("苹果" => "红色", "香蕉" => "黄颜色", "梨" => "绿色");

foreach ($fruitColor as $fruit => $color) {
    echo "{$fruit}通常是{$color}的。<br/>";
}
?>

输出:

苹果通常是红色的。
香蕉通常是黄颜色的。
梨通常是绿色的。

本节课程知识要点

掌握PHP关联数组,以下核心点值得留意:

  • 键值对用=>定义,左边键名,右边值。键名通常是字符串,放在引号里。

  • 两种定义方式灵活选择:一次性初始化用array()[],逐步填充用$arr['key'] = value

  • 访问元素用方括号加键名,如$arr['键名']。键名区分大小写("Name"和"name"是两个不同的键)。

  • 遍历用foreach($数组 as $键 => $值),这是遍历关联数组直接的方式,同时拿到键和值。

  • 键名是关联数组的核心优势,它让数据结构自带注释效果。好的键名命名能减少很多沟通成本。

关联数组和索引数组怎么选

这个选择本质上取决于数据的性质。

  • 数据是“一串同质的东西”(比如一堆用户名、一组标签),而且顺序本身有意义,用索引数组。

  • 数据是“一个东西的多个属性”(比如一个用户的姓名、年龄、城市),或者两组数据之间有映射关系(比如学生对应成绩、国家对应首都),用关联数组。

个人经验分享: 在代码号学习编程的过程中,我注意到一个常见误区:有人用索引数组存用户信息,然后靠注释说明索引0=姓名,索引1=年龄。这在工作量少时不算大问题,但项目迭代几轮后,这种隐含的对应关系很容易被遗忘或误改。关联数组从代码层面就把字段含义固定下来了,省去了注释和记忆的负担。

主观建议: 如果你在纠结用哪种数组,一个简单的判断方法是问自己:“我后面查这个数据时,是希望通过位置拿(比如取第三个),还是通过名字拿(比如取邮箱)?”如果是后者,就用关联数组。大部分业务数据都更适合通过名字访问,所以关联数组在项目中用得比索引数组更频繁。

关联数组的常见使用场景

关联数组在PHP日常开发里几乎无处不在,以下是几个典型的应用场景:

  • 存储单条数据库记录:从数据库查出一行数据,mysqli_fetch_assoc()返回的就是关联数组,字段名是键,字段值是值。

  • 配置文件:把网站设置项存成关联数组,$config['站点名称']$config['运营年份']这样读取。

  • 处理JSON数据json_decode($json, true)会把JSON对象转成PHP关联数组,JSON的键变成数组的键。

  • 表单数据处理$_POST$_GET本身就是关联数组,表单字段的name属性就是键,用户填的值就是值。

这些场景里,关联数组都是内置或返回的格式。理解了关联数组的结构和遍历方式,处理这些数据就能上手得更快。

PHP关联数组用有语义的键名替代了数字索引,让数据的存和取都更直观。掌握=>定义键值对、方括号访问、以及foreach遍历键值同时获取这几个基本操作,日常开发里处理结构化数据的能力就有了一个比较靠实的基础。好的键名就像好的注释,写的时候多花几秒钟想一想,后面读代码时会感谢当时的自己。

← PHP索引数组:用数字下标管理有序数据列表 PHP多维数组:用嵌套结构处理表格与层级数据 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号