Почему 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;
}