Почему trim не будет работать как обратный вызов для Array walk или array map в PHP?
почему мой пример кода приводит к тому, что первая строка все еще имеет конечное пространство?
$a=array('test_data_1 ','test_data_2');
array_walk($a, 'trim');
array_map('trim', $a);
foreach($a AS $b){
var_dump($b);
}
строка (12) "test_data_1"строка(11) "test_data_2"
4 ответов
во-первых, array_walk-это неправильная функция для вашей цели.
во-вторых, array_map не изменяет исходный массив, но возвращает сопоставленный массив. Так что вам нужно:
$a = array_map('trim', $a);
на array_walk
чтобы изменить элементы (значения) в массиве, обратный вызов должен быть функцией, которая принимает свой первый параметр по ссылке и изменяет его (что не относится к plain 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);
}
использование 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);
}
trim()
хорош для подготовки данных перед проверкой или вставкой. Вы, вероятно, захотите подготовиться не только с отделкой. Классная техника, которую я видел раньше,- это "труба" через ваши функции подготовки:
$data = prepare($data, array(
'first_name' => 'trim|custom_function',
'surname' => 'trim',
));
красота этого способа делает код легко читаемым, и невероятно легко запускать функции на каждом конкретном элементе массива.
вот функция, которую я быстро постучал:
function prepare($data, $arr){
foreach($arr as $input_name => $functions){
foreach( explode('|', $functions) as $function){
$data[$input_name] = call_user_func($function, $data[$input_name]);
}
}
return $data;
}