【问题标题】:PHP - Get associative array value by date range without loopPHP - 按日期范围获取关联数组值,无需循环
【发布时间】:2020-02-23 20:11:12
【问题描述】:

我每周使用以下 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];
}

它有效。 但是有没有更好(即更清洁、更快)的方法来实现相同的结果?循环真的有必要吗? 谢谢。

更新

受到 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')];

我认为这是一个更好的解决方案(满足我的需要)。

【问题讨论】:

  • 完全可读的方法。
  • 再次询问,为什么不直接使用date('W'),获取当前 ISO-8601 周数?

标签: php foreach associative-array


【解决方案1】:

由于您的范围是星期一->星期日,您可以使用 ISO-8601 周编号。尽管没有 cmets,这里的数据更难解释。

<?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

【讨论】:

  • 这不是一个坏主意。但我会使用 DateTime 来获取周数。谢谢!
  • @AbsoluteBeginner 您的原始示例使用了date。所以就在这里。 strtotime 用于示例中的具体输入和输出,只需省略第二个参数,它将用time() 替换当前时间戳。 DateTime 对象给你买了什么?
  • 我的不是对您的解决方案的批评。与此同时,我发现了这个:stackoverflow.com/a/9567769/10668052。所以,我会更正我自己的代码。你的答案很完美。
  • @AbsoluteBeginner 链接的解决方案/方法如何帮助您,您将如何使用它,我很好奇?
【解决方案2】:

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'];
});

尽管如此,您最终仍将不得不循环过滤的项目以进行输出。

【讨论】:

  • 在这个过滤器之后,您将难以提取 html 属性。这表明 OP 的 foreach 更清晰、更容易。
  • 理想情况下,filteredItems 将作为变量传递给其他地方的视图模板 - 我不会在同一个地方过滤和回显输出......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多