在PHP开发中,数组是最常用的数据结构之一,给数组添加带键值元素是非常基础且高频的操作,不同的添加方式适用于不同的场景,理解这些方法的差异能帮助开发者写出更高效的代码。

直接赋值法添加带键值元素
直接赋值是最简单直观的带键值添加元素方式,只需要指定数组名、键名和对应的值即可完成添加,适合单个元素的添加场景。
<?php // 初始化一个空数组 $userInfo = []; // 直接赋值添加带键值元素 $userInfo['name'] = '张三'; $userInfo['age'] = 25; $userInfo['city'] = '北京'; // 打印数组查看结果 print_r($userInfo); ?>
这种方式的优点是语法简单,执行效率高,如果键名已经存在,新的赋值会直接覆盖原有键对应的值。如果要添加的键是数字索引,也可以直接指定索引值赋值,比如$arr[3] = 'test';。
使用array_push添加带键值元素
很多开发者知道array_push函数可以向数组尾部添加元素,但默认情况下它只能添加无键值的元素,如果要添加带键值元素,需要结合数组作为参数传入。
<?php $scoreList = ['math' => 90, 'english' => 85]; // 使用array_push添加带键值元素,需要传入一个关联数组作为参数 array_push($scoreList, ['physics' => 88, 'chemistry' => 92]); // 打印结果可以看到添加的是一个嵌套数组 print_r($scoreList); // 如果要直接添加键值对,不推荐用array_push,直接赋值更高效 ?>
注意array_push如果要添加带键值的元素,本质是把整个关联数组作为单个元素压入原数组,不会把键值对合并到原数组的顶层,因此如果不是要添加嵌套结构,不建议用这种方式添加带键值元素。
使用array_merge合并添加带键值元素
array_merge函数可以合并一个或多个数组,把后面的数组的键值对合并到前面的数组中,是批量添加带键值元素的常用方法。
<?php $baseConfig = ['host' => '127.0.0.1', 'port' => 3306]; $extraConfig = ['dbname' => 'test', 'charset' => 'utf8mb4']; // 合并两个数组,添加带键值元素 $allConfig = array_merge($baseConfig, $extraConfig); print_r($allConfig); // 如果有重复键名,后面的数组的键值会覆盖前面的 $overrideConfig = ['port' => 3307, 'timeout' => 10]; $newConfig = array_merge($allConfig, $overrideConfig); print_r($newConfig); ?>
这种方式适合需要批量添加多个带键值元素的场景,合并时会保留所有键值对,如果键名重复,后面数组的键值会覆盖前面的。如果要合并的数组是索引数组,键名会重新索引,关联数组的键名会保留。
使用+运算符合并添加带键值元素
除了array_merge,还可以使用+运算符合并数组来添加带键值元素,两者的区别在于处理重复键名的逻辑不同。
<?php $arr1 = ['a' => 1, 'b' => 2]; $arr2 = ['b' => 3, 'c' => 4]; // 使用+运算符合并,重复键名保留前面数组的值 $result1 = $arr1 + $arr2; print_r($result1); // 对比array_merge的结果,重复键名保留后面数组的值 $result2 = array_merge($arr1, $arr2); print_r($result2); ?>
使用+运算符合并时,如果键名已经存在,不会覆盖原有的值,只会保留最先出现的键值,这个特性和array_merge相反,开发者可以根据是否需要覆盖重复键来选择合适的方法。
不同方法的选择建议
- 单个带键值元素添加:优先选择直接赋值法,语法简单效率高
- 批量添加多个带键值元素且允许覆盖重复键:选择
array_merge - 批量添加多个带键值元素且不允许覆盖重复键:选择+运算符
- 需要添加嵌套数组元素:可以考虑
array_push,或者直接用数组赋值
在实际开发中,要根据具体的业务场景选择合适的方法,同时要注意键名的类型,PHP数组的键名可以是整数或字符串,其他类型会被自动转换,比如浮点数会截断为整数,布尔值会转为整数0或1,这些细节也需要留意避免出现问题。
PHParray键值对array_pusharray_merge修改时间:2026-07-03 06:18:12