Почему не обрезать работу в качестве обратного вызова для время ходьбы или карте массив в 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
изменения элементов (значений) в массиве обратный вызов должен быть функцией, которая берет свой первый параметр по ссылке и изменяет его (что не является случаем простого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; }