【问题标题】:Select a SubArray if today date is between 2 keys value如果今天的日期在 2 个键值之间,则选择一个子数组
【发布时间】:2026-02-07 13:45:01
【问题描述】:

我有一个这样的多维数组:

$array = array(
    0 => array(
        'name' => 'first element',
        'start' => '30/04/2015',
        'end' => '30/06/2015'
    ),
    1 => array(
        'name' => 'second element',
        'start' => '01/07/2015',
        'end' => '30/09/2015'
    ),
    2 => array(
        'name' => 'fourth element',
        'start' => '01/10/2015',
        'end' => '15/12/2015'
        )
);

我需要根据今天的日期选择一个数组子数组(项)。 今天的日期必须介于开始日期和结束日期键之间。

最后我想要这个:

$selected_subarray = array (
        'name' => 'first element',
        'start' => '30/04/2015',
        'end' => '30/06/2015'
    )

我用这样的方式检查两个日期之间:

function check_if_in_range($start_date, $end_date, $today_date)
{
  $start_d = strtotime($start_date);
  $end_d = strtotime($end_date);
  $today_d = strtotime($today_date);
  return (($today_d >= $start_d) && ($today_d <= $end_d));
}

我试着听从这个问题How to search by key=>value in a multidimensional array in PHP的建议

但如果我能够过滤一个 key = value,我就不能使用“check_if_in_range”函数来做同样的事情。

【问题讨论】:

  • 你是如何使用check_if_in_range的?
  • 正如 Glavić 在答案中指出的那样,我选择的错误是日期格式。我在 check_if_in_range 函数中将 '30/06/2015' 与 date('d/m/Y') 进行比较,但它不起作用。

标签: php arrays date array-filter


【解决方案1】:

您知道30/06/2015 是无效日期,而strtotime() 将返回false?见here。格式mm/dd/yyyy 是美国的月、日和年。所以你的格式是非标准的。

最好的方法是将其转换为标准格式,然后使用strtotime()example 或只使用DateTime::createFromFormat()example

了解格式化和转换日期的工作原理后,您可以执行简单的 foreach 循环,并在第一个找到的结果上中断。这里有一点demo

【讨论】:

    【解决方案2】:

    试试下面的方法

    foreach($array as $key => $value) {
        if(check_in_range($value['start'], $value['end'], $today_date)) {
            $selected_subarray = $value;
        }
    }
    

    【讨论】:

      最近更新 更多