6

重複の可能性:
PHPを使用して過去30日間の配列を作成する

今日と6日前の「過去7日間の売り上げ」でアレイを作成しようとしています。私はこれまでこれを使用しています:

$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 ) 

このように、MySQLクエリに日付が表示されていなくても、過去7日間の毎日が配列に含まれます。

これを行う方法について何か提案はありますか?

4

1 に答える 1

9

これを実行するための最も堅牢な方法は、次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タイムスタンプを保存するよりもここで役立つので、またはその他の関連する日付/時刻列タイプを調べることをお勧めします。時間に基づいてデータを照会するたびにUNIXタイムスタンプを作成する代わりに、MySQLの日付/時刻関数を使用して、探している行を適切に選択することができます。

于 2012-06-25T16:30:24.800 に答える