PHP array_walk() 函数详解:给数组每个元素套上自定义逻辑
- 2026年7月3日
- 125 次
文章目录
最近在给一个表单数据处理函数加日志,需要遍历每个字段判断是否合法。本来写了个 foreach,后来发现 array_walk() 一行就能搞定,而且还能改原数组的值。
这篇文章聊聊 array_walk()的用法、传引用参数、和array_map()的区别。
基本用法
array_walk(array, callback) - 对数组的每个元素执行回调函数。
<?php
$names = ['Alice', 'Bob', 'Charlie'];
array_walk($names, function(&$value, $key) {
$value = ucfirst($value);
});
print_r($names);
// Array ( [0] => Alice [1] => Bob [2] => Charlie )
?>
关键点
$value 必须传引用(&),否则修改不会反映到原数组。这是和array_map()最大的区别——array_map()]返回新数组,array_walk() 修改原数组。
实战场景
场景1:字段验证
<?php
$user = [
'name' => ' 张三 ',
'email' => ' ZHANGSAN@EXAMPLE.COM ',
'age' => '25',
];
array_walk($user, function(&$value, $key) {
if ($key === 'email') {
$value = trim(strtolower($value));
} else {
$value = trim($value);
}
});
print_r($user);
// Array ( [name] => 张三 [email] => zhangsan@example.com [age] => 25 )
?>
场景2:遍历二维数组
<?php
$users = [
['id' => 1, 'name' => '张三', 'score' => 85],
['id' => 2, 'name' => '李四', 'score' => 92],
['id' => 3, 'name' => '王五', 'score' => 78],
];
// 给每个用户的分数加上10分bonus
array_walk($users, function(&$user) {
$user['score'] += 10;
});
print_r($users);
// 分数都加了10分
?>
场景3:生成HTML列表
<?php
$items = ['苹果', '香蕉', '橘子'];
$html = '';
array_walk($items, function($item) use (&$html) {
$html .= '<li>' . htmlspecialchars($item) . '</li>';
});
echo '<ul>' . $html . '</ul>';
?>
array_walk()vs array_map()vs foreach
特性array_walk()foreach
<?php
$user = [
'name' => ' 张三 ',
'email' => ' ZHANGSAN@EXAMPLE.COM ',
'age' => '25',
];
array_walk($user, function(&$value, $key) {
if ($key === 'email') {
$value = trim(strtolower($value));
} else {
$value = trim($value);
}
});
print_r($user);
// Array ( [name] => 张三 [email] => zhangsan@example.com [age] => 25 )
?>
<?php
$users = [
['id' => 1, 'name' => '张三', 'score' => 85],
['id' => 2, 'name' => '李四', 'score' => 92],
['id' => 3, 'name' => '王五', 'score' => 78],
];
// 给每个用户的分数加上10分bonus
array_walk($users, function(&$user) {
$user['score'] += 10;
});
print_r($users);
// 分数都加了10分
?>
场景3:生成HTML列表
<?php
$items = ['苹果', '香蕉', '橘子'];
$html = '';
array_walk($items, function($item) use (&$html) {
$html .= '<li>' . htmlspecialchars($item) . '</li>';
});
echo '<ul>' . $html . '</ul>';
?>
array_walk()vs array_map()vs foreach
特性array_walk()foreach
<?php
$items = ['苹果', '香蕉', '橘子'];
$html = '';
array_walk($items, function($item) use (&$html) {
$html .= '<li>' . htmlspecialchars($item) . '</li>';
});
echo '<ul>' . $html . '</ul>';
?>
返回修改原数组(返回bool)返回新数组无
传引用支持(&value)需要 return支持(&value)
回调参数($value, $key, ...)($value)($key, $value)
适用场景原地修改转换数据复杂循环逻辑
踩坑提醒
-
引用丢失:回调函数参数不传 &,修改不会生效
-
foreach 中断:array_walk()不支持 break/continue 提前退出
-
多维数组:array_walk()只遍历一层,深层数组需要递归
-
空数组:空数组调用返回 true,回调不会被执行
-
array_walk()原地修改数组元素,适合表单清洗、字段验证
-
传引用参数 & 是修改生效的关键
-
遍历二维数组时注意引用层级
-
需要返回新数组时用array_map(),原地修改用array_walk()
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- PHP类常量如何定义及调用?PHP类常量调用实例代码 2022-12-03
- ZblogPhp主题幻灯片轮播制作教程 ZblogPhp主题幻灯片制作插件版 2022-10-12
- Python如何遍历输出列表所有的元素? 2021-11-06
- wordpress古腾堡小工具切换成经典小工具 2022-09-25
- PHP常用字符串函数分割与合并字符串函数用法及实例 2022-11-10
- 十一月你好 十一我的小棉袄你好 2022-11-06
