【问题标题】:PHP - Check Date Range/Availability in foreach loopPHP - 在 foreach 循环中检查日期范围/可用性
【发布时间】:2018-03-22 05:22:07
【问题描述】:

我正在为已借出的产品开发一个借出系统界面(类似于图书馆借阅系统)。我正在从数据库中检索一组满足一些基本条件的产品,然后我需要将它们显示在一个表格中并标记可用的和不可用的。

可用性是通过将用户输入的日期范围与每个产品的任何现有贷款的一系列日期范围进行比较来确定的。例如,用户可能输入 MM/DD/YYYY 格式的开始日期 03/26/2018 和结束日期 03/26/2018 并且产品可能具有现有的预订日期范围列表,例如 10/27/2017 - 05/01/2018,05/10/2018 - 05/21/2018, 08/10/2018 - 12/20/2018 其中每个日期范围为现有预订以逗号分隔。

我正在使用 foreach 循环来检索要在我的表中显示的初始产品集,因此我希望同时在 foreach 循环中加入一个测试,并确定每个产品是否可用。如果请求的开始/结束日期与任何现有产品预订日期之间没有重叠,则该产品可用,否则不可用。

这是我当前结构的一个示例:

 $loanStartDateRequested = '03/26/2018';
 $loanEndDateRequested = '03/26/2018';

 foreach($records as $record) {
        $existingLoanDateRanges = $record->getField('loanDateRanges');
        // this returns the comma separated values of existing date ranges

       // would like to test and compare the dates here and set a variable if available/not available
 }

【问题讨论】:

  • 如果您在数据库中使用逗号分隔日期范围,那么您的表格没有被规范化,并且您正在为一个长期受到伤害的世界做好准备。如果您正确设置数据库表,您将能够编写巧妙的查询来为您完成所有搜索/过滤——而不是使用 php.ini 搜索巨大的结果集并清除它们。请采纳这个建议,对规范化主题进行研究,稍后再感谢您自己。
  • 同意 mickmackusa。您违反了将一系列日期作为逗号分隔的字符串粘贴到 varchar 中的基本关系设计。该设计非常低效、有限且容易出错,更不用说要求您查看符合您标准的每一个产品,如果有适当的设计,您的查询将有效地只找到可用的产品在所需的范围内,并且会通过 SQL WHERE 子句这样做。您的贷款应使用 start_date、end_date DATE 列建模。

标签: php date


【解决方案1】:

您可以按如下方式测试产品的可用性:

$loanStartDateRequested = '03/26/2018';
$loanEndDateRequested = '03/26/2018';

foreach($records as $record) {
        $existingLoanDateRanges = $record->getField('loanDateRanges');
        // suppose it returns existing date range as 10/27/2017 - 05/01/2018,05/10/2018 - 05/21/2018, 08/10/2018 - 12/20/2018

        $existingDateRangeArray = explode(",", $existingLoanDateRanges);  // converts comma separated existing date range into array
         $available = 0;              // set variable available = 0

        foreach($existingDateRangeArray as $existingDate){    
              $existingDateArr = explode('-', $existingDate); // again converts daterange, for example, 05/10/2018 - 05/21/2018 into array 

              if(strtotime($loanStartDateRequested) >= strtotime(trim($existingDateArr[0])) && strtotime($loanEndDateRequested) <= strtotime(trim($existingDateArr[1])))
              {
                  $available = 1;
                   break;
               }
        }
 }

如果您有任何问题,请随时提问。

【讨论】:

  • OP 能否通过 php 中的爆炸和迭代函数调用来处理此任务?是的。 OP应该这样做吗?不。甜蜜的天堂,不。
  • @Ishpreet - 只是确认如果$available = 等于 1 则测试为真并且产品可用(未发现日期冲突)?还是反过来?
  • 是的,$available = 1 表示“产品可用
  • @Ishpreet 你能在这里解释一下 break 的用法吗?谢谢
  • @Ishpreet - 我一直在用03/20/2018-03/30/2018 的日期范围对此进行测试,当它不应该可用时,我得到了$available = 1,因为它与请求的日期范围重叠。知道我在这里做错了什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多