所以我有这种情况。我有多个数组,如下所示:
$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;发布于 2014-01-16 19:32:53
您的数据格式有点问题,因为您使用的格式是XX-XX-XX。那是什么意思?DD?嗯-DD-YY?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
)发布于 2014-01-16 19:33:43
你的方法似乎足够好。你为什么会认为它很慢?嗯,你可以用其他的,而不是。
如果你仍然感觉不舒服,那就考虑一下一周是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是一个星期一,结果证明是错误的,所以我不得不更改代码。
https://stackoverflow.com/questions/21170581
复制相似问题