Menu

PHP 关联数组:键值对

PHP 关联数组把值存放在你命名的键下:$user = ['name' => 'Ada', 'age' => 36]; 用 $user['name'] 读取。本文讲解如何添加、修改和删除键值对,遍历键和值,获取所有键或值,检查键是否存在,以及按键或按值排序。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

关联数组把每个值存放在你选定的键下,写作 key => value:$user = ['name' => 'Ada', 'age' => 36];。用 $user['name'] 读取值,给某个键赋值就能添加或修改它:$user['email'] = 'ada@example.com';。

在其他语言里,同样的结构叫作字典、映射或哈希表。在 PHP 中,它就是一个普通的数组,只不过键是字符串,而不是 0, 1, 2。

添加、修改和删除键值对

给不存在的键赋值,会把它添加到末尾。给已存在的键赋值,会替换它的值并保留它的位置。unset() 用来删除一个键值对。

array_push() 在这里帮不上忙:它只能追加数字键的值。要一次添加多个键值对,可以用 array_merge($stock, $more),此时新值优先;或者用 $stock + $more,此时已有的键保留原值。array_merge 页面对比了这两种写法。

遍历键和值

foreach ($array as $key => $value) 按添加的顺序逐个遍历键值对。只需要值的时候,省略 $key => 即可。

获取所有键或所有值

array_keys() 以普通列表返回所有键,array_values() 返回所有值,两者都从 0 开始重新编号。给 array_keys() 传第二个参数,它就只返回存有该值的键,这就是查找某个值对应的所有键的方法。

如果只要一个键,array_search() 返回第一个匹配的键,找不到时返回 false。array_search 页面解释了为什么必须用 !== false 来比较这个结果。

检查键是否存在

isset($arr['key']) 是最常用也最快的检查方式,但当键存在且值为 null 时,它会返回 false。这种情况下 array_key_exists('key', $arr) 会返回 true。如果是读取并提供默认值,?? 运算符能一步完成两件事。

按键或按值排序

ksort() 按键排序,asort() 按值排序,两者都会让每个键和它的值保持对应。krsort() 和 arsort() 则按相反的顺序排序。不要对关联数组使用 sort():它会丢掉所有键,并从 0 重新编号。

这些函数都是原地排序并返回 true,所以 $sorted = ksort($arr) 得到的是 true,而不是数组。自定义排序用 uasort() 和 uksort()。

键值互换、计数和转成 JSON

处理键值数据时,有几个一行代码的写法经常用到:array_flip() 交换键和值,array_count_values() 统计每个值出现的次数,json_encode() 把数组转换成 JSON 对象。

常见错误:读取不存在的键

读取不存在的键会返回 null,但你自己环境里的 PHP 还会输出一条警告:

<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3

用 ?? 给读取操作设置默认值,它永远不会产生警告;如果缺少键的情况需要单独处理,就先用 isset() 检查。

在双引号字符串中,要用花括号把查找包起来:"{$user['email']}"。不加花括号时,PHP 只接受不带引号的写法 "$user[email]",这很容易写错。

常见问题

PHP 中怎么创建关联数组?

在方括号里把每一对写成 key => value:$prices = ['apple' => 1.2, 'pear' => 0.9];。用 $prices['apple'] 读取值。

PHP 中怎么按键对关联数组排序?

调用 ksort($arr); 按 A 到 Z 排序,或调用 krsort($arr); 按 Z 到 A 排序。两者都是原地排序,每个值都留在它的键上,返回的是 true,而不是排好序的数组。

PHP 中怎么遍历关联数组?

在 foreach 中同时使用两个变量:foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }。键值对按添加的顺序输出。

怎么获取关联数组的所有键?

array_keys($arr) 以索引数组的形式返回所有键,array_values($arr) 返回所有值。array_keys($arr, $value) 只返回值等于 $value 的那些键。

PHP 关联数组会保持插入顺序吗?

会。PHP 数组是有序映射,所以 foreach、print_r 和 json_encode 看到的键值对都是你插入时的顺序,直到你用 ksort()、asort() 或类似的函数对数组排序。

Coddy 编程语言插图

和 Coddy 一起学编程

开始