写这篇文章之前必须先说一句:each()函数从PHP 7.2.0开始被弃用,PHP 8.0.0中已经被移除。
如果你还在用PHP 7.2以下的版本,可以了解它;但如果你的PHP版本是7.2以上,这个函数用不了。官方的替代方案是foreach循环。
不过作为知识了解,还是讲一下这个函数当初是干啥的。
这函数当初是干啥的
each()函数用来获取数组内部指针当前指向的元素的键名和键值,然后自动把指针往前移动一位。它返回一个包含4个元素的数组:
-
[0]或[key]→ 当前元素的键名 -
[1]或[value]→ 当前元素的值
注意: 它同时返回数字索引和字符串索引两套信息。这个函数从PHP 4.0就有了,但现在已被移除。
语法格式(仅限PHP 7.2以下)
array each(array &$array): array
参数:
| 参数 | 说明 | 必填? |
|---|---|---|
| array | 要操作的数组(传引用,指针会被移动) | 必填 |
返回值: 返回当前元素的键值对数组;指针到达末尾时返回false。
示例1:索引数组的each()返回格式
<?php
// 注意:这段代码只能在PHP 7.2以下运行
$courses = ["PHP基础", "MySQL教程", "JavaScript入门"];
$result = each($courses);
print_r($result);
?>
输出:
Array
(
[1] => PHP基础
[value] => PHP基础
[0] => 0
[key] => 0
)
返回值同时包含:
-
数字索引0对应键名0
-
数字索引1对应键值"PHP基础"
-
字符串索引"key"对应键名0
-
字符串索引"value"对应键值"PHP基础"
示例2:遍历数组的老式写法
<?php
// PHP 7.2以下的老式遍历方式
$student_scores = ["张伟" => 85, "李芳" => 92, "王磊" => 78];
reset($student_scores); // 指针重置到开头
while ($element = each($student_scores)) {
echo "键名:" . $element['key'] . ",值:" . $element['value'] . "\n";
}
?>
输出:
键名:张伟,值:85
键名:李芳,值:92
键名:王磊,值:78
这种写法在PHP 4和5的时代很常见,但现在已经被foreach彻底替代了。
个人经验分享
-
为什么each()被弃用?
-
性能问题:每次调用返回一个包含4个元素的数组,内存开销大
-
指针副作用:容易在循环中出bug(比如嵌套循环时指针位置混乱)
-
foreach更简洁、更高效、不容易出错
-
-
如果你的代码里还有each()怎么办?
-
升级PHP到7.2+时程序会报错
-
需要手动改成
foreach
改前:
while (list($key, $value) = each($array)) { // 处理 }改后:
foreach ($array as $key => $value) { // 处理 } -
-
list()配合each()的常见写法
// 老式写法 while (list($key, $val) = each($data)) { echo "$key => $val"; } // 新式写法 foreach ($data as $key => $val) { echo "$key => $val"; }
示例3:关联数组的each()返回
<?php
// PHP 7.2以下
$product = ["sku" => "KB-001", "name" => "机械键盘", "price" => 299];
$result = each($product);
print_r($result);
?>
输出:
Array
(
[1] => KB-001
[value] => KB-001
[0] => sku
[key] => sku
)
关联数组中,键名会放到[0]和[key]里,值放到[1]和[value]里。
示例4:指针移动的效果
<?php
// PHP 7.2以下
$colors = ["红色", "绿色", "蓝色"];
echo "第一次调用:\n";
print_r(each($colors)); // 拿到第一个元素,指针移到第二个
echo "\n第二次调用:\n";
print_r(each($colors)); // 拿到第二个元素,指针移到第三个
echo "\n第三次调用:\n";
print_r(each($colors)); // 拿到第三个元素,指针移到末尾
echo "\n第四次调用:\n";
var_dump(each($colors)); // 指针已在末尾,返回false
?>
输出:
第一次调用:
Array([1] => 红色 [value] => 红色 [0] => 0 [key] => 0)
第二次调用:
Array([1] => 绿色 [value] => 绿色 [0] => 1 [key] => 1)
第三次调用:
Array([1] => 蓝色 [value] => 蓝色 [0] => 2 [key] => 2)
第四次调用:
bool(false)
现在PHP的正确做法
既然each()已经没了,这里给出当前版本的写法:
<?php
// 现在PHP的写法(PHP 7.2+ / 8.x)
$student_scores = ["代码号001" => 85, "代码号002" => 92, "代码号003" => 78];
// 方式一:foreach(推荐)
foreach ($student_scores as $key => $value) {
echo "键名:{$key},成绩:{$value}\n";
}
// 方式二:如果要逐个手动控制指针,用current() + key() + next()
reset($student_scores);
while (key($student_scores) !== null) {
$key = key($student_scores);
$value = current($student_scores);
echo "键名:{$key},成绩:{$value}\n";
next($student_scores);
}
?>
本节课程知识要点
-
each()已在PHP 7.2+被弃用,PHP 8.0+被移除 -
该函数返回当前元素的键和值,同时移动指针
-
返回值包含数字索引(0/1)和字符串索引(key/value)
-
现在PHP中应使用
foreach替代 -
如果必须手动控制指针,用
current()、key()、next()、reset()组合 -
升级旧项目时注意替换所有
each()调用