PHP数组内部有个指针,指向当前正在处理的元素。key()函数返回这个指针当前位置的键名,和current()返回值对应——current()拿值,key()拿键名。
这俩经常配对使用。这个函数从PHP 4.0就有了。
语法格式
mixed key(array $array): mixed
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| array | 要操作的数组 | 必填 |
返回值:
-
返回当前指针位置的键名
-
指针指向末尾时返回
null -
空数组返回
null
相关函数
| 函数 | 作用 |
|---|---|
current() |
获取当前元素的值 |
key() |
获取当前元素的键名 |
next() |
指针向前移动一位 |
prev() |
指针向后移动一位 |
reset() |
指针重置到第一个元素 |
end() |
指针移到之后一个元素 |
示例1:关联数组
<?php
$student = [
"id" => 1001,
"name" => "张伟",
"score" => 85,
"class" => "软件工程"
];
echo "当前键名:" . key($student) . "\n";
echo "当前值:" . current($student) . "\n";
// 移动指针
next($student);
echo "移动后键名:" . key($student) . "\n";
echo "移动后值:" . current($student) . "\n";
?>
输出:
当前键名:id
当前值:1001
移动后键名:name
移动后值:张伟
新数组的指针默认指向第一个元素。
示例2:索引数组
<?php
$colors = ["红色", "绿色", "蓝色", "黄颜色"];
echo "当前键名:" . key($colors) . "\n";
next($colors);
echo "移动一次后键名:" . key($colors) . "\n";
next($colors);
echo "移动两次后键名:" . key($colors) . "\n";
?>
输出:
当前键名:0
移动一次后键名:1
移动两次后键名:2
索引数组的键名就是数字下标。
示例3:指针到末尾的情况
<?php
$fruits = ["苹果", "香蕉", "橙子"];
// 移动到末尾
end($fruits);
echo "末尾位置的键名:" . key($fruits) . "\n";
echo "末尾位置的值:" . current($fruits) . "\n";
// 继续往后移
next($fruits);
echo "再往后移动:\n";
var_dump("键名:" . key($fruits));
var_dump("值:" . current($fruits));
?>
输出:
末尾位置的键名:2
末尾位置的值:橙子
再往后移动:
string(12) "键名:"
string(9) "值:"
指针移出数组后,key()返回null,在字符串拼接时被转成空字符串。项目开发中要先判断key() !== null。
个人经验分享
-
key()和current()总是配对出现
需要同时获取键和值时,这两个函数一起用:$key = key($array); $value = current($array);或者直接用
foreach更省事。 -
和each()的区别
each()在PHP 7.2被弃用,PHP 8被移除。现在获取当前键值对的推荐方式就是key()+current()。 -
手动遍历数组的写法
reset($array); while (key($array) !== null) { $key = key($array); $value = current($array); // 处理 next($array); }但99%的场景用
foreach就够了,更简洁。 -
key()不会自动重置指针
如果之前用过next()、end()等,指针位置变了,key()返回的是当前位置。需要从头开始的话先调用reset()。
示例4:代码号学习编程场景
<?php
// 场景:手动遍历学生成绩表(演示指针操作)
$scores = [
"code001" => 85,
"code002" => 92,
"code003" => 78,
"code004" => 88,
"code005" => 96
];
echo "从头遍历所有学生成绩:\n";
reset($scores); // 确保从头开始
while (($key = key($scores)) !== null) {
$value = current($scores);
echo "{$key}: {$value}分\n";
next($scores);
}
// 演示指针独立性的例子
echo "\n指针独立性的演示:\n";
$copy = $scores; // 复制数组
reset($scores); // 原数组重置
next($scores); // 原数组移到第二个
echo "原数组当前键名:" . key($scores) . "\n";
echo "复制数组当前键名:" . key($copy) . "\n";
?>
输出:
从头遍历所有学生成绩:
code001: 85分
code002: 92分
code003: 78分
code004: 88分
code005: 96分
指针独立性的演示:
原数组当前键名:code002
复制数组当前键名:code001
注意:复制数组时,指针位置是独立的,互不影响。
示例5:空数组的处理
<?php
$empty = [];
var_dump(key($empty));
?>
输出:
NULL
空数组调用key()返回null,不会报错。
示例6:配合prev()和next()的复杂遍历
<?php
$tasks = [
"pending" => ["任务A", "任务B"],
"in_progress" => ["任务C"],
"completed" => ["任务D", "任务E", "任务F"],
"archived" => []
];
// 跳过空值的键,找到第一个非空数组的键名
reset($tasks);
while (key($tasks) !== null) {
$current_value = current($tasks);
if (!empty($current_value)) {
echo "第一个有任务的阶段:" . key($tasks) . "\n";
echo "任务数量:" . count($current_value) . "\n";
break;
}
next($tasks);
}
?>
输出:
第一个有任务的阶段:pending
任务数量:2
示例7:PHP 7.3+ 的替代方案
<?php
$data = ["first" => 1, "second" => 2, "third" => 3];
// 老式:key() + reset()
reset($data);
$first_key_old = key($data);
// 新式:array_key_first()(不移动指针)
$first_key_new = array_key_first($data);
echo "老式方法获取第一个键名:{$first_key_old}\n";
echo "新式方法获取第一个键名:{$first_key_new}\n";
// 注意:reset()移动了指针
echo "reset后当前键名:" . key($data) . "\n";
?>
输出:
老式方法获取第一个键名:first
新式方法获取第一个键名:first
reset后当前键名:first
PHP 7.3引入了array_key_first()和array_key_last(),获取首尾键名不用再移动指针了。但如果需要遍历过程中获取当前键名,key()仍然有用。
本节课程知识要点
-
key()返回数组内部指针当前位置的键名 -
配合
current()可以获取完整的当前键值对 -
新数组指针默认指向第一个元素
-
指针移出数组或数组为空时返回
null -
配合
reset()、next()、prev()、end()移动指针 -
复制数组时,指针位置是独立的
-
从PHP 4.0开始可用
-
PHP 7.3后获取首尾键名建议用
array_key_first()/array_key_last()