2014-01-16 68 views
0

所以我有这种情况。我有多个阵列它们是这样的:几周前的总结

$array('date'=>'00-00-00', 'value'=>'xx'); 

我想要做的是通过所有的阵列,使4个变量是什么:$week1, $week2, $week3, $week4在那里我将存储依赖,如果它是1周前的累计值,2几周前,3周前或4周前从某个日期开始。

我试过的是这个,但它不起作用。虽然我有很多的日期,并且他们的价值观,它返回0的一切,名称只是占位,我不竟叫他们“阵”:

 $date = 'xx-xx-xx'; 
    $month = array(); 

    $week1 = strtotime($date . '-1 week'); 
    $week2 = strtotime($date . '-2 week'); 
    $week3 = strtotime($date . '-3 week'); 
    $week4 = strtotime($date . '-4 week'); 


    foreach($arrays as $array){ 

     if((date('W', strtotime($array['date']) == date('W', strtotime($week1)))) AND (date('Y', strtotime($array['date'])) == date('Y', strtotime($week1)))){ 
      $month['week1'] += $array['value']; 
     } 

     if((date('W', strtotime($array['date']) == date('W', strtotime($week2)))) AND (date('Y', strtotime($array['date'])) == date('Y', strtotime($week2)))){ 
      $month['week2'] += $array['value']; 
     } 

     if((date('W', strtotime($array['date']) == date('W', strtotime($week3)))) AND (date('Y', strtotime($array['date'])) == date('Y', strtotime($week3)))){ 
      $month['week3'] += $array['value']; 
     } 

     if((date('W', strtotime($array['date']) == date('W', strtotime($week4)))) AND (date('Y', strtotime($array['date'])) == date('Y', strtotime($week4)))){ 
      $month['week4'] += $array['value']; 
     }   
    } 

    return $month; 

回答

1

你有一点小麻烦你的数据格式在于你使用了XX-XX-XX的模糊格式。那是什么意思? YY-MM-DD? MM-DD-YY? DD-MM-YY?你不能指望strtotime在没有进一步定义日期字符串代表什么的情况下转换该格式。

我也建议使用DateTime,DateInterval,DatePeriod等类,因为它们比老的PHP日期操作函数功能更全面。

所以,我可能会实现这样的:

$array = array(...); // your input array 
$start_time = new DateTime(); 
// Alternately, if you need week boundary to not be based on "now" 
// but rather on fixed start of week you could do something like 
// $current_time = new DateTime('Monday this week 00:00:00'); 
$date_interval = new DateInterval('P1W'); 
$date_interval->invert = 1; // make it negative interval 
// build DatePeriod object with 4 interval periods - don't include start date 
$date_period = new DatePeriod($start_time, $date_interval, 4, DatePeriod::EXCLUDE_START_DATE); 

$final_array = array(0,0,0,0); // the destination array with default start values 
array_walk($array, function($item, $key_not_used) use ($date_period, $final_array) { 
    // change date format as necessary below 
    $item_time = DateTime::createFromFormat('y-m-d', $item['date']); 
    $value = $item['value']; 
    foreach($date_period as $i => $comparison_time) { 
     if ($item_time > $comparison_time) { 
      // aggregate this value into $final_array. 
      // I assume this is simple addition but any sort of aggregation can be used by changing this line below 
      $final_array[$i] = $final_array[$i] + $value; 
      // break out of loop since comparison already completed 
      break; 
     } 
    } 
}); 
var_dump($final_array); 

这将使最终阵列状值:

Array(
    [0] => ?, // aggregation for dates > 1 week ago 
    [1] => ?, // aggregation for dates between 1 and 2 weeks ago 
    [2] => ?, // aggregation for dates between 2 and 3 weeks ago 
    [3] => ? // aggregation for dates between 3 and 4 weeks ago 
) 
0

你的做法似乎不够好。你为什么认为它很慢?那么,你可以使用elseif而不是if。

如果你仍然感觉不好,考虑一周是7 * 24 * 3600 = 604800秒。因此,一个星期的星期一上午(00:00)是:

$timestamp = strtotime($date); 
$time_since_thursday = $timestamp % 604800; 
$time_since_monday = ($time_since_thursday + 259200) % 604800; 
$monday = $timestamp - $time_since_monday; 

然后,你可以只使用从本周一早上到其他日期的差别:

foreach($arrays as $array) { 
    $difference = $monday - $array['date']; 
    if ($difference > 0) { // else it would be in the same week or even later 
    $difference_weeks = (int)($difference/604800); 
    if ($differenceWeeks <= 3) { // else it is more than the 4th week behind 
     $month['week' . ($difference_weeks + 1)] += $array['value']; 
    } 
    } 
} 

考考你,如果这解决方案更快......

编辑:出于某种原因,我认为01.01.1970是一个星期一,结果是错误的,所以我不得不改变代码。

+0

出于某种原因,我的代码不仅速度慢,而且现在不工作,我检查 – raygo

+0

@raygo你读过Mike Brant的答案了吗?也许这是一个问题(尽管YYYY-mm-dd的日期应该很好)。另外,我会用'$ month = array('week1'=> 0,'week2'=> 0,'week3'=> 0,'week4'=> 0)初始化数组;' –

+0

是我的$ date变量等于日期('Ym-d') – raygo