手头有两个数组,一个存键名,一个存值,想拼成一个键值对数组。自己写循环当然能实现,但PHP早就准备好了array_combine(),一行代码搞定。
注意: 两个数组的元素数量必须一致,否则报错。这个坑不少新手踩过。
语法格式
array_combine(array $keys, array $values): array
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| keys | 作为键名的数组 | 必填 |
| values | 作为值的数组 | 必填 |
返回值: 合并后的关联数组。如果两个数组长度不同,返回false并触发E_WARNING错误。
核心规则
-
第一个数组的每个元素变成新数组的键名
-
第二个数组的每个元素变成新数组的值
-
两个数组元素数量必须相等
示例1:基础用法
<?php
$keys = ["id", "name", "score", "grade"];
$values = [1001, "张伟", 87.5, "B"];
$student = array_combine($keys, $values);
print_r($student);
?>
输出:
Array
(
[id] => 1001
[name] => 张伟
[score] => 87.5
[grade] => B
)
省去了手动定义数组的麻烦,直接从两个列表构建出结构化的数据。
示例2:数量不一致会报错
<?php
$names = ["键盘", "鼠标", "显示器", "U盘"]; // 4个
$prices = [299, 89]; // 2个
$result = array_combine($names, $prices);
print_r($result);
?>
输出:
Warning: array_combine(): Both parameters should have an equal number of elements
false
函数不会帮你补齐或者截断,数量对不上直接报错。所以用之前先用count()检查一下比较稳妥。
示例3:代码号学习编程场景
<?php
$student_ids = ["code001", "code002", "code003", "code004"];
$final_scores = [85, 92, 78, 88];
$score_board = array_combine($student_ids, $final_scores);
print_r($score_board);
?>
输出:
Array
(
[code001] => 85
[code002] => 92
[code003] => 78
[code004] => 88
)
用学号作为键名,成绩作为值,很方便地构建了一个成绩表。
示例4:键名重复的情况
<?php
$keys = ["a", "b", "a", "c"];
$values = ["苹果", "香蕉", "橙子", "葡萄"];
$fruits = array_combine($keys, $values);
print_r($fruits);
?>
输出:
Array
(
[a] => 橙子
[b] => 香蕉
[c] => 葡萄
)
注意:键名"a"出现了两次,后面的"橙子"覆盖了前面的"苹果"。如果你不希望数据丢失,先确保键名数组是唯一的(比如用array_unique()去重)。
示例5:从查询结果中提取数据
<?php
// 从数据库查到的两列数据
$product_names = ["机械键盘", "游戏鼠标", "曲面显示器", "降噪耳机"];
$intory_counts = [45, 128, 12, 73];
$intory = array_combine($product_names, $intory_counts);
arsort($intory); // 按库存量排序
print_r($intory);
?>
输出:
Array
(
[游戏鼠标] => 128
[降噪耳机] => 73
[机械键盘] => 45
[曲面显示器] => 12
)
结合arsort()、asort()这些排序函数,可以做更灵活的数据展示。
个人经验分享
-
什么时候用这个函数?
-
从CSV文件读两行数据(一行表头一行数据)要组装成关联数组
-
API返回的数据是分开的两个数组(一个存字段名,一个存字段值)
-
把两个列表快速转成键值对映射
-
-
为什么不用循环手动组装?
-
代码更简短,可读性更高
-
内置函数底层用C实现,处理大数组时性能更好
-
-
常见的坑:
-
忘了检查两个数组长度是否一致。建议加个判断:
if(count($keys) === count($values))再执行 -
键名数组里有重复值,后面的会覆盖前面的,数据无声无息丢失
-
键名数组不能包含对象或数组,只能是string或int类型
-
-
配合list()或explode()使用:
$keys = explode(",", "name,age,city"); $values = ["李芳", 26, "上海"]; $person = array_combine($keys, $values);
示例6:错误处理的正规写法
<?php
function safe_array_combine($keys, $values) {
if (count($keys) !== count($values)) {
// 记录日志或返回空数组,而不是让程序崩溃
error_log("array_combine: 两个数组长度不一致");
return [];
}
return array_combine($keys, $values);
}
$headers = ["id", "title", "price"];
$row = [101, "PHP教程"];
$result = safe_array_combine($headers, $row);
print_r($result);
?>
项目开发中建议封装一个带长度检查的包装函数,避免线上报错。
本节课程知识要点
-
array_combine()用第一个数组的值作为键名,第二个数组的值作为值 -
两个数组的元素个数必须相等,否则返回false
-
键名数组中的重复值会导致数据覆盖(后面覆盖前面)
-
键名只能使用string或int类型
-
函数从PHP 5.0开始可用
-
配合
array_slice()、array_unique()做数据处理效果不错