Фильтр с обратным вызовом пропускает какое-то условие

#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 оператор — ваш лучший вариант.