Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 获取最近X周的周数_Php_Date_Date Range - Fatal编程技术网

Php 获取最近X周的周数

Php 获取最近X周的周数,php,date,date-range,Php,Date,Date Range,我有一个脚本,它构建了过去12周的周数数组,如下所示: $week_numbers = range(date('W'), date('W')-11, -1); 但是,如果当前周数为1,则将返回如下数组: Array ( [0] => 1 [1] => 0 [2] => -1 [3] => -2 [4] => -3 [5] => -4 [6] => -5 [7] => -6 [

我有一个脚本,它构建了过去12周的周数数组,如下所示:

$week_numbers = range(date('W'), date('W')-11, -1);
但是,如果当前周数为1,则将返回如下数组:

Array
(
    [0] => 1
    [1] => 0
    [2] => -1
    [3] => -2
    [4] => -3
    [5] => -4
    [6] => -5
    [7] => -6
    [8] => -7
    [9] => -8
    [10] => -9
    [11] => -10
)
但是我需要这个数组看起来像这样:

Array
(
    [0] => 1
    [1] => 52
    [2] => 51
    [3] => 50
    [4] => 49
    [5] => 48
    [6] => 47
    [7] => 46
    [8] => 45
    [9] => 44
    [10] => 43
    [11] => 42
)
有人能想出一个简单的解决办法吗

我曾考虑过这样做(未经测试):

$current_week_number=日期('W');

如果($current\u week\u number如果你不害怕循环,你可以这样做:

$week_numbers = range(date('W'), date('W')-11, -1);
foreach($week_numbers as $key => $value) { if($value < 1)  $week_numbers[$key] += 52; }
$week_numbers=范围(日期('W'),日期('W')-11,-1);
foreach($key=>value的周数){if($value<1)$week_数[$key]+=52;}

您可以执行模运算
%
技巧:

$week_numbers = range(date('W'), date('W')-11, -1);
foreach ($week_numbers as $i => $number) {
    $week_numbers[$i] = (($week_numbers[$i] + 52 - 1) % 52) + 1;
}
// -1 +1 is to change the range from 0-51 to 1-52
我发现,像这样使用模运算通常对日期计算很有用,你可以使用
12

一个想法在几个月内完成类似的运算

$i = 1;
while ($i <= 11) {

echo date('W', strtotime("-$i week")); //1 week ago

$i++;
}
$i=1;

虽然($i嗯,我认为最简单的方法是在获得日期后创建数组:

$week_numbers = array_map(function($iDay)
{
   return ($iDay+52)%52?($iDay+52)%52:52;
}, range(date('W'), date('W')-11));

-请注意,您不能只执行
%
,因为52%52将是
0
(您需要
52

执行循环,从日期中减去一周,然后返回格式化的一周number@Dagon你的意思是这样的:
date('W',strottime(“-1周”));
?如果是这样的话,这将起作用,但我必须循环12次…你认为这是一个比我建议的更好的解决方案吗?这是一个更好的解决方案!!好的解决方案,但模数是什么?为了避免负数。
(5+52)%52=5
(没有改变,52再次被删除),
(-5+52)%52=47
(本质上是52-5)唯一的问题是,这将使第52周到第0周
(0+52)%52=0
您应该这样做:
$week\u numbers[$i]=($week\u numbers[$i]+52-1)%52)+1;
因此它使
1-52
而不是
0-51
@FritsvanCampen我本打算接受这一正确答案,但我注意到有些年份有53周,这将使此解决方案毫无用处:-(.为了获得正确的周数,必须使用date函数。无论如何,感谢您的帮助,这仍然是一个比我建议的更好的解决方案。请参阅此处:另一个有趣的方法+1这是最好的解决方案,因为它使用date函数来计算周数。有些年份有53周,这意味着其他解决方案将错过一周。谢谢!参考,请看这里:我假设您想要一个真正的日期函数,而不仅仅是一个0-52计数。
$week_numbers = array_map(function($iDay)
{
   return ($iDay+52)%52?($iDay+52)%52:52;
}, range(date('W'), date('W')-11));