李涛自留地
回到顶部
首页 > php学习 > PHP array_walk() 函数详解:给数组每个元素套上自定义逻辑

PHP array_walk() 函数详解:给数组每个元素套上自定义逻辑

文章目录

最近在给一个表单数据处理函数加日志,需要遍历每个字段判断是否合法。本来写了个 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

返回修改原数组(返回bool)返回新数组无
传引用支持(&value)需要 return支持(&value)
回调参数($value, $key, ...)($value)($key, $value)
适用场景原地修改转换数据复杂循环逻辑

踩坑提醒

  • 引用丢失:回调函数参数不传 &,修改不会生效

  • foreach 中断:array_walk()不支持 break/continue 提前退出

  • 多维数组:array_walk()只遍历一层,深层数组需要递归

  • 空数组:空数组调用返回 true,回调不会被执行

  • array_walk()原地修改数组元素,适合表单清洗、字段验证

  • 传引用参数 & 是修改生效的关键

  • 遍历二维数组时注意引用层级

  • 需要返回新数组时用array_map(),原地修改用array_walk()

若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。