Вернуть только элементы в массиве php, которые равны месяцу моего настраиваемого поля (array_filter)

Я возвращаю все пятницы за текущий месяц и следующий месяц в раскрывающемся списке, что отлично работает.

У меня есть дополнительный шаг, на котором я хочу отображать в раскрывающемся списке только те месяцы, которые соответствуют месяцу в этом поле: $ productMonth = get_field ('product_month');

Это поле возвращает следующее значение: May.

Поэтому мне нужно просмотреть все элементы в этом массиве и вернуть их только в том случае, если месяц, который они с ними связали, совпадает с $ productMonth.

Я пробовал использовать array_filter, но знаю, что $ var.date ('F') не является ответом, я предполагаю, что я, вероятно, мог бы что-то сделать, получив последний бит строки, так как он всегда будет возвращать месяц, но это не идеально :

$array2 = array_filter($fridaysUnique, "matches_month");

function matches_month($var, $productMonth)
{
    return ($var.date('F') === $productMonth);
}

А вот остальная часть моего кода:

<?php

$productMonth = get_field('product_month');
$thisMonth = date('F');
$nextMonth = date('F', strtotime("next month"));

$fridays = array();
$fridays[0] = date('l jS F', strtotime('first friday of this month'));
$fridays[1] = date('l jS F', strtotime('second friday of this month'));
$fridays[2] = date('l jS F', strtotime('third friday of this month'));
$fridays[3] = date('l jS F', strtotime('fourth friday of this month'));
$fridays[4] = date('l jS F', strtotime('fifth friday of this month'));
$fridays[5] = date('l jS F', strtotime('first friday of next month'));
$fridays[6] = date('l jS F', strtotime('second friday of next month'));
$fridays[7] = date('l jS F', strtotime('third friday of next month'));
$fridays[8] = date('l jS F', strtotime('fourth friday of next month'));
$fridays[9] = date('l jS F', strtotime('fifth friday of next month'));

$fridaysUnique = array_unique($fridays);

?>

<select>
<?php foreach ( $fridaysUnique as $friday ) : ?>
    <option value=""><?php echo $friday; ?></option>
<?php endforeach; ?>
</select>

Помощь будет принята с благодарностью, и любые рекомендации по оптимизации кода приветствуются.

Спасибо


person MayhemBliz    schedule 12.05.2021    source источник
comment
Вы должны хранить в своем массиве значения отметок времени, а не форматированные даты. Затем вы можете легко отформатировать эту временную метку, как вам нравится, в вашей функции фильтра, например, получить только месяц в письменной форме. Получение его на display в желаемом формате должно выполняться в точке, где вы фактически создаете вывод.   -  person CBroe    schedule 12.05.2021
comment
@CBroe большое спасибо, это будет намного аккуратнее   -  person MayhemBliz    schedule 12.05.2021


Ответы (1)


Если вы измените свой array_filter на следующее, метод filter выдаст вам нужные значения:

$array2 = array_filter($fridaysUnique, function ($val) use ($productMonth) {
    return (DateTime::createFromFormat('l jS F', $val))->format('F') === $productMonth);
});

Приведенный выше код выполняет все значения в вашем массиве $fridaysUnique и преобразует каждое значение в объект DateTime, который форматируется в строку для сравнения со значением в $productMonth (обратите внимание на использование use, позволяющее использовать переменную $productMonth внутри вашего анонимного метода фильтрации).

Однако вместо того, чтобы преобразовывать даты дважды, как это, я бы предложил вам для начала хранить DateTime объектов в вашем массиве.

person Casper André Casse    schedule 12.05.2021