Итак, у меня есть следующий массив:
array:3 [
0 => "6.05"
1 => "5.94"
2 => "5.96"
]
Что передается через следующую функцию:
$filteredShots = array_filter($shots, function($shot) {
if (is_numeric($shot)) {
return floatval($shot);
}
});
Что потом выплевывает точно такой же массив:
array:3 [
0 => "6.05"
1 => "5.94"
2 => "5.96"
]
Почему эти струны? Я сказал преобразовать их в floatval Я что-то не так делаю? Я сумасшедший?
Если я умру и сделаю дамп в операторе return, я получу: 6,05, а не «6,05», так что ... почему массив это отражает?






array_filter ожидает от функции обратного вызова true или false, чтобы сохранить или удалить соответствующий элемент. В вашей реализации, если у вас нет значения 0 или falsey, он всегда будет возвращать true. Вам нужен array_map, который фактически применяет возврат обратного вызова:
$filteredShots = array_map(function($shot) {
if (is_numeric($shot)) {
return floatval($shot);
}
}, $shots);
Вы также можете изменить исходный массив с помощью array_walk:
array_walk($shots, function(&$shot) {
if (is_numeric($shot)) {
$shot = floatval($shot);
}
});
Вы можете использовать array_filter для удаления нечисловых:
$filteredShots = array_filter($shots, function($shot) {
return is_numeric($shot) ? true : false;
});
//or simply
$filteredShots = array_filter($shots, 'is_numeric');
@TheWebs Для этого и предназначена документация, хотя названия функций, кажется, довольно ясно описывают то, что они делают. Фильтрация означает сокращение коллекции до элементов, соответствующих некоторым критериям.
Я могу принять это за 8 минут, я всегда не понимаю, для чего подходит фильтр массива и для чего подходит карта массива. Спасибо, что прояснили это :)