【问题标题】:PHP: How to fill an array with dates (Y-m-d) as keys [duplicate]PHP:如何用日期(Y-m-d)作为键填充数组[重复]
【发布时间】:2015-02-05 09:05:16
【问题描述】:

我想用值填充一个数组。该数组的应该是格式为“YEAR-MONTH-DAY”的可读日期。起点是“2010-5-25”。 该过程应在当前日期中止。显然,所有日期都应该是有效日期。

我想过做这个循环。但似乎 PHP 无法在“for”循环中检查多个条件。不过,它没有给我任何警告或错误。

    for ($d = 25, $m = 5, $y = 2010,
        $this_day = date('j'),
        $this_month = date('n'),
        $this_year = date('Y');
        ($y <= $this_year) && ($m <= $this_month) && ($d <= $this_day);
        $d++)
    {
            $values[$y.'-'.$m.'-'.$d] = 0; //fill array
            $d++;
            if(!checkdate($m, $d, $y)){
                $d = 1;
                $m++;
                if($m > 12) { $m = 1; $y++; }
        }
    }

用嵌套循环这样做会很痛苦。

一种解决方案是使用整数时间作为键,然后稍后在另一个循环中将它们转换为可读日期。

有没有更有效的方法?

【问题讨论】:

    标签: php arrays date


    【解决方案1】:

    您可以尝试使用strtotime()。示例:

    $values = array();
    $oldDate = strtotime('2010-05-25');
    while($oldDate <= time()){
        $values[date('Y-m-d', $oldDate)] = 'Your value';
        $oldDate += 86400;
        //Other codes
    }
    

    【讨论】:

    • 应该是 86400,而不是 86000。另外,如果您希望日期不超过今天,将 $oldDate &lt;= time() 更改为 $oldDate &lt; time()起作用。
    • 谢谢@TomRobinson,这是一个打字错误:) +1
    【解决方案2】:
    $startDate = new \DateTime('2010-05-25');
    $endDate = new \DateTime();
    
    $interval = new \DateInterval('P1D');
    $period = new \DatePeriod ($startDate, $interval, $endDate);
    
    $dates = array();
    foreach ($period as $key => $date) {
        $dates[$date->format('Y-m-d')] = null;
    }
    var_dump($dates);
    

    【讨论】:

      【解决方案3】:

      我冒昧地清理了你的代码以使其可读:

      <?php
      
      $this_day = date('j');
      $this_month = date('n');
      $this_year = date('Y');
      echo sprintf("Today: d-m-y: %s-%s-%s\n", $this_day, $this_month, $this_year);
      
      for ($d = 25,  $m = 5,  $y = 2010;
          ($y <= $this_year) && ($m <= $this_month) && ($d <= $this_day);
          $d++) {
              echo sprintf("Date: d-m-y: %s-%s-%s\n", $d, $m, $y);
              $values[$y.'-'.$m.'-'.$d] = 0; //fill array
              $d++;
              if(!checkdate($m, $d, $y)){
                  $d = 1;
                  $m++;
                  if($m > 12) { $m = 1; $y++; }
           }
      }
      

      这表明代码运行良好。那就是如果你选择了正确的条件! 今天是 07 日,但您的初始值从 25 日开始,这会伪造条件。要验证选择的开始日期为“02”并查看输出...

      我猜你想重新检查你的状况。很可能是你想表达的其他东西......

      【讨论】:

        【解决方案4】:

        首先;循环不会执行,因为您要单独检查年份编号是否低于当前年份编号等。但是今天是 7 日,您从 2010 年 5 月 25 日开始:

        $d = 25;
        $this_day = date('j'); // today: 7
        $loop = $d <= $this_day; // evaluates to false
        

        因为“day-check”的计算结果为 false,所以整个表达式的计算结果为 false。所以循环只会在 12 月 25 日开始运行。

        您可以更好地使用DateTime 对象来构造日期并对创建的对象进行修改。这也可以让您在闰年等情况下大汗淋漓。示例:

        for ( 
                $start = new DateTime('2010-05-25'), 
                    $today = new DateTime('now') ;
                $start->diff($today)->format('%a') >= 0 ;
                $start->modify('+1 day')
        ) {
            $values[$start->format('Y-m-d')] = 0;
        }
        

        很简单!

        【讨论】:

          【解决方案5】:

          这里是一些错误检查的代码,例如,提供的有效日期和开始日期不能大于结束日期:

          function arrayKeyDates($start, $end='now') {
              // can use DateTime::createFromFormat() instead
              $startDate = new DateTime($start);
              $endDate = new DateTime($end);
          
              if ($startDate === false) {
                  // invalid start date.
                  return;
              }
          
              if ($endDate === false) {
                  // invalid end date.
                  return;
              }
          
              if ($startDate > $endDate) {
                  // start date cannot be greater than end date.
                  return;
              }
          
              $dates = array();
              while($startDate <= $endDate) {
                  $dates[$startDate->format('Y-n-j')] = 0;
                  $startDate->modify('+1 day');
              }
          
              return $dates;
          }
          
          print_r(arrayKeyDate('2014-11-30'));
          

          我得到以下输出:

          Array
          (
              [2014-11-30] => 0
              [2014-12-1] => 0
              [2014-12-2] => 0
              [2014-12-3] => 0
              [2014-12-4] => 0
              [2014-12-5] => 0
              [2014-12-6] => 0
              [2014-12-7] => 0
          )
          

          错误处理代码留给您。

          更新(日期时间::createFromFormat) 如果您想使用自定义格式创建 DateTime 对象,您可以在我的函数中执行以下操作:

          $startDate = DateTime::createFromFormat('Y-n-j', $start);
          

          $start 的值为 2010-5-25

          欲了解更多信息,请参阅:http://php.net/manual/en/datetime.createfromformat.php

          【讨论】:

            【解决方案6】:

            我知道这是一个老问题,但可能对新观众有所帮助

            $dummyArray = array_fill(1, 7, 0);
            $dates = array_flip(array_map(function($val, $idx) {
                return date_create('2010-5-25')->modify('-' . $idx . ' days')->format('Y-m-d');
            }, $dummyArray, array_keys($dummyArray)));
            

            我基本上是在生成一个虚拟数组,其中包含我想要提取的天数作为索引,然后使用 array_map 将它们转换为日期,之后我只需翻转数组以将日期作为键价值观

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-03-08
              • 2018-05-25
              • 2012-07-21
              • 1970-01-01
              • 2015-10-26
              • 1970-01-01
              • 2021-09-17
              相关资源
              最近更新 更多