#php #closures
#php #замыкания
Вопрос:
У меня есть следующий код для фильтрации массива в PHP; он работает нормально. Но после добавления дополнительных условий фильтрации он перестал работать.
Рабочий код
$s_item = array_values(array_filter($itmlist, function ($itmlist) {
return ($itmlist['itmslsprc'] > 0);
}
));
Код, который не работает после добавления дополнительных условий
$s_item = array_values(array_filter($itmlist, function ($itmlist) {
return ($itmlist['itmslsprc'] > 0 amp;amp; $today >= $itmlist['itmslsfr'] amp;amp; $today <= $itmlist['itmslsto']);
}
));
Обе $today
и другие даты были инициализированы в формате 2021-01-12 00:00:00
.
Кто-нибудь может сказать, что могло пойти не так? Заранее спасибо за любые советы.
Комментарии:
1. где
$today
определено2. если вы хотите использовать $today во вложенной функции, вы должны передать его! Вероятно, ваша переменная $today не определена
3. В чем проблема с разными форматами? «Не работает» звучит довольно широко, так что вы пытались его отладить?
Ответ №1:
если ваш today находится вне функции, вы можете использовать его внутри функции следующим образом :
$s_item = array_values(array_filter($itmlist, function ($itmlist) use($today) {
return ($itmlist['itmslsprc'] > 0 amp;amp; $today >= $itmlist['itmslsfr'] amp;amp; $today <= $itmlist['itmslsto']);
}
));
Ответ №2:
если ваш today находится за пределами функции, вы можете использовать «использовать»
Комментарии:
1. Пожалуйста, избегайте дублирования существующих ответов, если вы не хотите добавить что-то, что не было рассмотрено в других ответах
Ответ №3:
Как уже упоминалось, вы можете просто импортировать переменную в область обратного вызова, полагаясь на use
оператор.
Замыкания PHP не привязываются автоматически к внешней области видимости (как это происходит в таких языках, как Javascript).
Но если вы придерживаетесь более функциональной парадигмы программирования (и работаете с PHP> = 7.4), вы можете избежать ручного импорта и полагаться на функции стрелок PHP.
$today = // your value here
$s_item = array_values(array_filter($itmlist, fn($itmlist) =>
$itmlist['itmslsprc'] > 0 amp;amp;
$today >= $itmlist['itmslsfr'] amp;amp;
$today <= $itmlist['itmslsto']
));
fn() => returnExpression
будет иметь доступ к $today
.
Примечание
Это копирование по значению, как указано в руководстве:
Когда переменная, используемая в выражении, определена в родительской области, она будет неявно записана по значению.
Если вы хотите изменить внешнюю переменную и не хотите никаких дополнительных параметров закрытия, то use
оператор — ваш лучший вариант.