Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于两个日期创建包含日期信息的数组_Php_Arrays_Date_Loops_For Loop - Fatal编程技术网

Php 基于两个日期创建包含日期信息的数组

Php 基于两个日期创建包含日期信息的数组,php,arrays,date,loops,for-loop,Php,Arrays,Date,Loops,For Loop,我手动创建了以下数组(底部),我希望仅使用两个易于分解的字符串(explode())以编程方式创建它 我已经分解了字符串,并找出了这两个日期之间的间隔是多少个月 $min_date = explode('-',$min_date); $min_date['year'] = intval($min_date[0]); $min_date['month'] = intval($min_date[1]); $min_date['day'] = intval($min_d

我手动创建了以下数组(底部),我希望仅使用两个易于分解的字符串(explode())以编程方式创建它

我已经分解了字符串,并找出了这两个日期之间的间隔是多少个月

    $min_date = explode('-',$min_date);
    $min_date['year'] = intval($min_date[0]);
    $min_date['month'] = intval($min_date[1]);
    $min_date['day'] = intval($min_date[2]);

    $max_date = explode('-',$max_date);
    $max_date['year'] = intval($max_date[0]);
    $max_date['month'] = intval($max_date[1]);
    $max_date['day'] = intval($max_date[2]);

$months_between = ($max_date['month'] - $min_date['month']) + 12 * ($max_date['year'] - $min_date['year']);
返回1

cal\u days\u in\u month()
函数似乎也很有用,我只是不知道如何

$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year)
这是我手动创建的数组

$periods = array(
  '0' => array(
    'month'=>'march',
    'week'=>'1',
    'days'=>'4',
    'readable'=>' Thurs Mar, 01, 2012 - Sun Mar, 04, 2012',
    'created_at_min'=>'2012-03-01 00:00:00',
    'created_at_max'=>'2012-03-04 24:00:00'
  ),
  '1' => array(
    'month'=>'march',
    'week'=>'2',
    'days'=>'7',
    'readable'=>' Mon Mar, 05, 2012 - Sun Mar, 11, 2012',
    'created_at_min'=>'2012-03-05 00:00:00',
    'created_at_max'=>'2012-03-11 24:00:00'
  ),
  '2' => array(
    'month'=>'march',
    'week'=>'3',
    'days'=>'7',
    'readable'=>' Mon Mar, 12, 2012 - Sun Mar, 18, 2012',
    'created_at_min'=>'2012-03-12 00:00:00',
    'created_at_max'=>'2012-03-18 24:00:00'
  ),
  '3' => array(
    'month'=>'march',
    'week'=>'4',
    'days'=>'7',
    'readable'=>' Mon Mar, 19, 2012 - Sun Mar, 25, 2012',
    'created_at_min'=>'2012-03-19 00:00:00',
    'created_at_max'=>'2012-03-25 24:00:00'
  ),
  '4' => array(
    'month'=>'march',
    'week'=>'5',
    'days'=>'6',
    'readable'=>' Mon Mar, 26, 2012 - Sun Mar, 31, 2012',
    'created_at_min'=>'2012-03-26 00:00:00',
    'created_at_max'=>'2012-03-31 24:00:00'
  ),
  '5' => array(
    'month'=>'april',
    'week'=>'1',
    'days'=>'1',
    'readable'=>' Sun Apr, 1, 2012',
    'created_at_min'=>'2012-04-01 00:00:00',
    'created_at_max'=>'2012-04-01 24:00:00'
  ),
  '6' => array(
    'month'=>'april',
    'week'=>'2',
    'days'=>'7',
    'readable'=>' Mon Apr, 2, 2012 - Sun Apr, 8, 2012',
    'created_at_min'=>'2012-04-01 00:00:00',
    'created_at_max'=>'2012-04-08 24:00:00'
  ),
  '7' => array(
    'month'=>'april',
    'week'=>'3',
    'days'=>'7',
    'readable'=>' Mon Apr, 9, 2012 - Sun Apr, 15, 2012',
    'created_at_min'=>'2012-04-09 00:00:00',
    'created_at_max'=>'2012-04-15 24:00:00'
  ),
  '8' => array(
    'month'=>'april',
    'week'=>'4',
    'days'=>'7',
    'readable'=>' Mon Apr, 16, 2012 - Sun Apr, 22, 2012',
    'created_at_min'=>'2012-04-16 00:00:00',
    'created_at_max'=>'2012-04-22 24:00:00'
  ),
  '9' => array(
    'month'=>'april',
    'week'=>'5',
    'days'=>'3',
    'readable'=>' Mon Apr, 23, 2012 - Wed Apr, 25, 2012',
    'created_at_min'=>'2012-04-16 00:00:00',
    'created_at_max'=>'2012-04-25 00:00:00' // note last day timestamp needs to be 00:00:00
  ),
);
在我深入讨论之前,PHP提供的任何东西都能提供极大的帮助吗?

$weeks = array(
  'may' = array(1,2,3,4,5),
  'april' = array(1,2,3,4,5),
);

编辑:更新代码,使周不跨越月

24:00:00
不是实时的…:)我已经写了一半的答案了,但是我现在没有耐心去弄清楚所有血淋淋的细节。基本上你要找的是函数,还有很多函数。增加由
strotime
创建的时间戳,从开始日期循环到结束日期。使用
date
的各种选项获取有关特定日期的所有信息,然后使用星期几、月天数、月日等进行一些计算。
strotime
创建一个unix时间戳,这似乎是一个很难循环的时间戳,这是您的意思吗?是的。为什么要使用一个时间戳,你可以很容易地增加和使用日期?他认为你想循环每毫秒。这太神奇了,我感觉很糟糕,因为我可以看到你投入了这么多的精力。我使用了你之前的一些代码,但放弃了7天的增量,主要是因为每月续费的问题。你可以看到,我的示例数组的pocket
5
是4月初。道琼斯指数在一周中的某一天再次增强了这一点。我要看看这个新代码。感谢您进一步开发!我正在尝试使用你的代码。它有几个问题。首先,我需要每周只包含一个月,
$numOfWeeks
var根据这一原则缩短(我的数组长度是
9
你的数组长度是
8
)。换言之,我需要你的口袋在当月分开。另一个基本问题是,没有规定每周都在周日结束。基本上,我试图从我的示例中获得口袋
5
9
。但我好像把你的代码弄乱了。我还需要实现“周”数。我相信这一切都可以通过一个类似于这样的
weeks
数组来解决(更新帖子)。唉,我还没有成功。。我认为一个月可能总有5周,除非它在周一开始?不,这不可能是对的。。。如果我使用周和双循环,我可以废弃
$numOfWeeks
。把这件事讲清楚对我很有帮助,不是在星期天结束吗?我看到你有一个
太阳,2012年4月1日
一周一天,因为这是一个星期天,而第一周是4天,因为你在星期天结束。这是一个有效的观察。但也是这样,因为我希望这一周从周一开始。这里有一些视觉表现。
$weeks = array(
  'may' = array(1,2,3,4,5),
  'april' = array(1,2,3,4,5),
);
$min_date = new DateTime('2012-03-01 00:00:00');
$max_date = new DateTime('2012-04-25 00:00:00');
$numOfWeeks = ceil($min_date->diff($max_date)->days / 7.0);

$baseDate = $min_date->getTimestamp();
$startOfWeek = 'Mon';
for ($i = 0; $i <= $numOfWeeks + 1; $i++)
{
    $weekRangeStart = date('D M, d, Y', $baseDate);
    if (date('M', strtotime("Next Sunday", $baseDate)) == date('M', $baseDate))
    {
        $weekRangeEnd = date('D M, d, Y', strtotime("Next Sunday", $baseDate));
        $nextDateObject = new DateTime(date('r', strtotime('Next Monday', $baseDate)));
    }
    else
    {
        $weekRangeEnd = date('D M, d, Y', strtotime("last day of this month", $baseDate));
        $nextDateObject = new DateTime(date('r', strtotime("last day of this month", $baseDate)));
    }

    $baseDateObject = new DateTime(date('r', $baseDate));

    $daysInWeek = $baseDateObject->diff($nextDateObject)->days;

    $periods[] = array('month' => date('F', $baseDate), 'days' => $daysInWeek, 
                'readable' => $weekRangeStart . ' - ' . $weekRangeEnd);

    if (date('D', $baseDate) != $startOfWeek)
        $baseDate = strtotime("Next Monday", $baseDate);
    else
        $baseDate = strtotime("+1 week", $baseDate);
}

var_dump($periods);
    array
  0 => 
    array
      'month' => string 'March' (length=5)
      'days' => int 4
      'readable' => string 'Thu Mar, 01, 2012 - Sun Mar, 04, 2012' (length=37)
  1 => 
    array
      'month' => string 'March' (length=5)
      'days' => int 7
      'readable' => string 'Mon Mar, 05, 2012 - Sun Mar, 11, 2012' (length=37)
  2 => 
    array
      'month' => string 'March' (length=5)
      'days' => int 7
      'readable' => string 'Mon Mar, 12, 2012 - Sun Mar, 18, 2012' (length=37)
  3 => 
    array
      'month' => string 'March' (length=5)
      'days' => int 7
      'readable' => string 'Mon Mar, 19, 2012 - Sun Mar, 25, 2012' (length=37)
  4 => 
    array
      'month' => string 'March' (length=5)
      'days' => int 5
      'readable' => string 'Mon Mar, 26, 2012 - Sat Mar, 31, 2012' (length=37)
  5 => 
    array
      'month' => string 'April' (length=5)
      'days' => int 7
      'readable' => string 'Mon Apr, 02, 2012 - Sun Apr, 08, 2012' (length=37)
  6 => 
    array
      'month' => string 'April' (length=5)
      'days' => int 7
      'readable' => string 'Mon Apr, 09, 2012 - Sun Apr, 15, 2012' (length=37)
  7 => 
    array
      'month' => string 'April' (length=5)
      'days' => int 7
      'readable' => string 'Mon Apr, 16, 2012 - Sun Apr, 22, 2012' (length=37)
  8 => 
    array
      'month' => string 'April' (length=5)
      'days' => int 7
      'readable' => string 'Mon Apr, 23, 2012 - Sun Apr, 29, 2012' (length=37)
  9 => 
    array
      'month' => string 'April' (length=5)
      'days' => int 0
      'readable' => string 'Mon Apr, 30, 2012 - Mon Apr, 30, 2012' (length=37)