2014-12-07 152 views
0

我想填充值的數組。該陣列的應爲可讀日期,格式爲「YEAR-MONTH-DAY」。起點是'2010-5-25'。 過程應該退出當前日期。顯然,所有的日期應該是有效的日期。PHP:如何填補日期的數組(Y-M-d)作爲鍵

我想過要做這個循環。但似乎PHP是不能檢查不止一個條件在「for」循環。不過,它並沒有給我任何警告或錯誤。

for ($d = 25, $m = 5, $y = 2010, 
     $this_day = date('j'), 
     $this_month = date('n'), 
     $this_year = date('Y'); 
     ($y <= $this_year) && ($m <= $this_month) && ($d <= $this_day); 
     $d++) 
    { 
      $values[$y.'-'.$m.'-'.$d] = 0; //fill array 
      $d++; 
      if(!checkdate($m, $d, $y)){ 
       $d = 1; 
       $m++; 
       if($m > 12) { $m = 1; $y++; } 
     } 
    } 

用嵌套循環做這件事會很痛苦。

一個解決方案是使用整數次作爲關鍵字,然後在另一個循環中將它們轉換爲可讀的日期。

有沒有更高效的方法?

回答

2

只要您可以嘗試使用strtotime()。例如:

$values = array(); 
$oldDate = strtotime('2010-05-25'); 
while($oldDate <= time()){ 
    $values[date('Y-m-d', $oldDate)] = 'Your value'; 
    $oldDate += 86400; 
    //Other codes 
} 
+1

這應該是86400,而不是86000. 另外,如果你想日期直到但不包括今天的日期,改變'$ oldDate <=時間()'來'$ oldDate 2014-12-07 18:10:39

+0

謝謝@TomRobinson,這是一個打字錯誤:) +1 – MH2K9 2014-12-07 18:12:23

0
$startDate = new \DateTime('2010-05-25'); 
$endDate = new \DateTime(); 

$interval = new \DateInterval('P1D'); 
$period = new \DatePeriod ($startDate, $interval, $endDate); 

$dates = array(); 
foreach ($period as $key => $date) { 
    $dates[$date->format('Y-m-d')] = null; 
} 
var_dump($dates); 
0

我冒昧地清理你的代碼一點點,使其可讀:

<?php 

$this_day = date('j'); 
$this_month = date('n'); 
$this_year = date('Y'); 
echo sprintf("Today: d-m-y: %s-%s-%s\n", $this_day, $this_month, $this_year); 

for ($d = 25, $m = 5, $y = 2010; 
    ($y <= $this_year) && ($m <= $this_month) && ($d <= $this_day); 
    $d++) { 
     echo sprintf("Date: d-m-y: %s-%s-%s\n", $d, $m, $y); 
     $values[$y.'-'.$m.'-'.$d] = 0; //fill array 
     $d++; 
     if(!checkdate($m, $d, $y)){ 
      $d = 1; 
      $m++; 
      if($m > 12) { $m = 1; $y++; } 
    } 
} 

這表明代碼工作得很好。也就是說,如果你選擇正確的條件! 今天是文化局,但你的初始值開始與僞造條件的第25位。要驗證選擇'02'的開始日期,並看到輸出...

我想你想重新檢查你的條件。最有可能的是你想表達的東西......

0

首先;該循環將不會執行,因爲你是單獨檢查,如果年數越低則本年度數量等,但今天是第7,和你在2010年5月25日開始:

$d = 25; 
$this_day = date('j'); // today: 7 
$loop = $d <= $this_day; // evaluates to false 

因爲「天-check」的計算結果爲假,則整個表達式評估爲假。所以這個循環只會在十二月二十五號開始運行。

您可以更好地使用DateTime對象來構建日期並對創建的對象執行修改。這也將安全你出了很多汗與東西一樣閏年等。舉例:

for ( 
     $start = new DateTime('2010-05-25'), 
      $today = new DateTime('now') ; 
     $start->diff($today)->format('%a') >= 0 ; 
     $start->modify('+1 day') 
) { 
    $values[$start->format('Y-m-d')] = 0; 
} 

容易做吧!

1

這裏是代碼做一些錯誤檢查,例如,有效日期提供和起始日期不能大於結束日期更大:

function arrayKeyDates($start, $end='now') { 
    // can use DateTime::createFromFormat() instead 
    $startDate = new DateTime($start); 
    $endDate = new DateTime($end); 

    if ($startDate === false) { 
     // invalid start date. 
     return; 
    } 

    if ($endDate === false) { 
     // invalid end date. 
     return; 
    } 

    if ($startDate > $endDate) { 
     // start date cannot be greater than end date. 
     return; 
    } 

    $dates = array(); 
    while($startDate <= $endDate) { 
     $dates[$startDate->format('Y-n-j')] = 0; 
     $startDate->modify('+1 day'); 
    } 

    return $dates; 
} 

print_r(arrayKeyDate('2014-11-30')); 

我得到以下輸出:

Array 
(
    [2014-11-30] => 0 
    [2014-12-1] => 0 
    [2014-12-2] => 0 
    [2014-12-3] => 0 
    [2014-12-4] => 0 
    [2014-12-5] => 0 
    [2014-12-6] => 0 
    [2014-12-7] => 0 
) 

錯誤處理代碼留給你。

UPDATE(日期時間:: createFromFormat) 如果你想使用自定義的格式就可以了,在我的函數來創建DateTime對象,你可以做這樣的事情:

$startDate = DateTime::createFromFormat('Y-n-j', $start); 

$start會具有值2010-5-25

欲瞭解更多信息,請參見:http://php.net/manual/en/datetime.createfromformat.php