Почему не обрезать работу в качестве обратного вызова для время ходьбы или карте массив в 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 8

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;
}