Как получить последние 7 дней с помощью PHP

Возможный дубликат:
Создание массива последних 30 дней с использованием PHP

Я пытаюсь создать массив с «последними 7-дневными продажами», который сегодня плюс 6 дней назад. Я использую это до сих пор:

$rightnow = time(); $time_window = $rightnow - (60*60*24*6); // 6 days ago + today = 7 days $tw_time = date('M d', $time_window); $tw_time = strtotime($tw_time); // 6 days ago starting at 00:00:00 $valid_sales = mysql_query("SELECT amt, created FROM sales WHERE created > $tw_time"); $sale_data = array(); foreach ($valid_sales as $sale) { $display_date = date('M d', $sale['created']); if (array_key_exists($display_date,$sale_data)) { // If date is in array $sale_data[$display_date] = $sale_data[$display_date] + $sale['amt']; // Add amount to date's sales } else { // If date is not in array $sale_data[$display_date] = $sale['amt']; // Create key with this amount } } // End foreach valid_sales 

Это даст мне массив с ключом, являющимся датой и значением, являющимся объемом продаж для этой даты. то есть:

 Array ( [Jun 19] => 19.00 [Jun 20] => 52.50 [Jun 22] => 2.00 ) 

Проблема, с которой я столкнулась, состоит в том, что мне нужно добавлять каждый день в массив, даже если в этот день не было продаж (никаких результатов не найдено в запросе MySQL). Итак, я получаю такой массив:

 Array ( [Jun 19] => 19.00 [Jun 20] => 52.50 [Jun 21] => 0.00 [Jun 22] => 2.00 [Jun 23] => 0.00 [Jun 24] => 0.00 [Jun 25] => 0.00 ) 

Таким образом, каждый день в течение последних 7 дней находится в массиве, даже если дата не появилась в запросе MySQL.

Любые предложения относительно того, как это сделать?

Самый надежный способ сделать это – использовать DateTime вместо strtotime :

 $now = new DateTime( "7 days ago", new DateTimeZone('America/New_York')); $interval = new DateInterval( 'P1D'); // 1 Day interval $period = new DatePeriod( $now, $interval, 7); // 7 Days 

Теперь вы можете создать свой массив таких дат:

 $sale_data = array(); foreach( $period as $day) { $key = $day->format( 'M d'); $sale_data[ $key ] = 0; } 

Это инициализирует ваш массив чем-то вроде:

 array(8) { ["Jun 18"]=> int(0) ["Jun 19"]=> int(0) ["Jun 20"]=> int(0) ["Jun 21"]=> int(0) ["Jun 22"]=> int(0) ["Jun 23"]=> int(0) ["Jun 24"]=> int(0) ["Jun 25"]=> int(0) } 

Теперь у вас есть массив со всеми возможными датами за последние 7 дней, и вы можете сделать это в своем цикле:

 $display_date = date('M d', $sale['created']); $sale_data[$display_date] += $sale['amt']; 

Вам не нужно проверять, существует ли ключ массива, поскольку он гарантированно существует.

Наконец, я бы рекомендовал DATETIME или другие связанные типы столбцов даты / времени, так как они были бы более полезными здесь, чем хранение временных меток UNIX. Вы можете использовать функции даты и времени MySQL для правильного выбора строк, которые вы ищете, вместо того, чтобы создавать временную метку UNIX каждый раз, когда вы хотите запрашивать данные в зависимости от времени.