← PHP中的array_key_first():获取数组的第一个键名 PHP中的array_key_last():获取数组的最后一个键名 →

PHP中的key():获取数组当前指针位置的键名

原创 2026-05-22 PHP 已有人查阅

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

个人经验分享

  1. key()和current()总是配对出现
    需要同时获取键和值时,这两个函数一起用:

    $key = key($array);
    $value = current($array);

    或者直接用foreach更省事。

  2. 和each()的区别
    each()在PHP 7.2被弃用,PHP 8被移除。现在获取当前键值对的推荐方式就是key() + current()

  3. 手动遍历数组的写法

    reset($array);
    while (key($array) !== null) {
        $key = key($array);
        $value = current($array);
        // 处理
        next($array);
    }

    但99%的场景用foreach就够了,更简洁。

  4. 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()

← PHP中的array_key_first():获取数组的第一个键名 PHP中的array_key_last():获取数组的最后一个键名 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号