为什么trim不能作为PHP中array_walk或array_map的回调函数?

16
为什么我的示例代码最终结果第一个字符串仍然有尾随空格?
$a=array('test_data_1 ','test_data_2');
array_walk($a, 'trim');
array_map('trim', $a);                    
foreach($a AS $b){
    var_dump($b);
}
test_data_1test_data_2
3个回答

58

首先,array_walk根本不是您的目的所需的正确函数。

其次,array_map不会更改原始数组,但会返回映射的数组。所以您需要使用:

$a = array_map('trim', $a);

1
谢谢,我没有注意到array_map返回的内容 - 但是请问您能否说明为什么您认为array_walk是一个错误的函数? - Jaak Kütt
9
如果你阅读手册,你会发现array_walk仅仅是用数组的每个值(和键)调用一个函数。所以它会有与以下代码相同的效果:trim('test_data_1 ', 0); trim('test_data_2 ', 1) - 没有赋值,没有副作用(顺便说一下,trim的第二个参数是错误的)。当然,你可以编写自己的函数来使用array_walk,然后修剪实际的数组元素。 - Fabian Schmengler

4

如果要使用array_walk修改数组中的项目(值),回调函数必须是一个通过引用传递其第一个参数并修改它的函数(这不是普通trim的情况),因此您的代码将变为:

$a=array('test_data_1 ','test_data_2');
array_walk($a, function (&$value) { $value = trim($value); }); // by-reference modification
// (no array_map)
foreach($a AS $b){
    var_dump($b);
}

或者,使用array_map时,您必须使用返回值重新分配数组,因此您的代码将变为:

$a=array('test_data_1 ','test_data_2');
// (no array_walk)
$a = array_map('trim', $a); // array reassignment
foreach($a AS $b){
    var_dump($b);
}

0

array_map 返回一个新数组,可以试试这个方法

$a=array('test_data_1 ','test_data_2');
array_walk($a, 'trim');
$a = array_map('trim', $a);
foreach($a AS $b){
    var_dump($b);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接