为什么赢了';t trim在PHP中用作数组\步或数组\映射的回调?
为什么我的示例代码导致第一个字符串仍然有尾随空格为什么赢了';t trim在PHP中用作数组\步或数组\映射的回调?,php,trim,array-map,array-walk,Php,Trim,Array Map,Array Walk,为什么我的示例代码导致第一个字符串仍然有尾随空格 $a=array('test_data_1 ','test_data_2'); array_walk($a, 'trim'); array_map('trim', $a); foreach($a AS $b){ var_dump($b); } 字符串(12)“测试数据”字符串(11)“测试数据” 数组\映射返回一个新数组,请尝试以下操作 $a=array('test_data_1 ','test_
$a=array('test_data_1 ','test_data_2');
array_walk($a, 'trim');
array_map('trim', $a);
foreach($a AS $b){
var_dump($b);
}
字符串(12)“测试数据”字符串(11)“测试数据”
数组\映射返回一个新数组,请尝试以下操作
$a=array('test_data_1 ','test_data_2');
array_walk($a, 'trim');
$a = array_map('trim', $a);
foreach($a AS $b){
var_dump($b);
}
首先,array_walk对于您的目的来说是一个错误的函数 其次,array_map不会更改原始数组,而是返回映射的数组。因此,您需要的是:
$a = array_map('trim', $a);
对于要修改数组中的项(值)的
array\u 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);
}
$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);
}
或者,使用array\u map
必须使用返回值重新分配数组,这样代码将变成:
$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);
}
$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);
}
谢谢,您错过了array_map返回的内容-但是pealse您可以指定为什么将concider array_walk作为错误的函数吗?如果您阅读,您将看到array_walk仅使用数组的每个值(和键)调用一个函数。因此,其效果与:
trim('test_data_1',0)相同;trim('test_data_2',1)
-没有分配,没有副作用(顺便说一下,trim的第二个参数是错误的)。当然,您可以为array_walk编写自己的函数,然后修剪实际的数组元素。