PHP - Получить значение ассоциативного массива по диапазону дат без цикла - PullRequest
0 голосов
/ 23 февраля 2020

Я использую следующий код PHP, чтобы показать другой текст (только один) каждую неделю:

<?php

$items = [

[
'start' => '2020-02-03',
'end' => '2020-02-09',
'html' => 'Text #1'
],

[
'start' => '2020-02-10',
'end' => '2020-02-16',
'html' => 'Text #2'
],

[
'start' => '2020-02-17',
'end' => '2020-02-23',
'html' => 'Text #3'
],

];

$currentDate = date('Y-m-d');

foreach ($items as $item) {
   if ($currentDate >= $item[start] && $currentDate <= $item[end]) echo $item[html];
}

Это работает. Но есть ли лучший (то есть чище, быстрее) способ достичь того же результата? L oop действительно необходим? Спасибо.

ОБНОВЛЕНИЕ

Вдохновленный ответом Progrock (что я благодарен), я бы изменил свой код следующим образом:

$items =
[
    '06' => 'Text #1',
    '07' => 'Text #2',
    '08' => 'Text #3',
    '09' => 'Text #4'
];

$date = new DateTime(date('Y-m-d'));
echo $items[$date->format('W')];

Я думаю это лучшее решение (для того, что мне нужно).

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Поскольку ваши диапазоны - понедельник-> воскресенье, вы можете использовать недельную нумерацию ISO-8601. Хотя здесь данные труднее интерпретировать без комментариев.

<?php
$items =
[
    '06' => 'Text #1',
    '07' => 'Text #2',
    '08' => 'Text #3'
];
$iso_week = date('W', strtotime('2020-02-12'));
echo $items[$iso_week];

Вывод:

Text #2
0 голосов
/ 24 февраля 2020

https://www.php.net/manual/en/function.array-filter.php

$currentDate = date('Y-m-d');

$filteredItems = array_filter($items, function($item) use ($currentDate) {
    return $currentDate >= $item['start'] && $currentDate <= $item['end'];
});

Тем не менее, вам все равно придется l oop отфильтрованных элементов для вывода, в конце концов.

...