关联数组把每个值存放在你选定的键下,写作 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() 或类似的函数对数组排序。