2013-03-20 29 views
-4

我有一個用php編寫的表單,下面的數組和兩個變量: startDate和endDate。給定日期範圍的PHP修改數組

我想要做的是僅顯示在用戶定義的日期範圍內的日期。

$startDate = "2013-03-08"; 
$endDate = "2013-03-12"; 

Array 
(
    [0] => 2013-03-06|Lorem|Mom|01:45 
    [1] => 2013-03-07|ipsum|Dad|01:00 
    [2] => 2013-03-08|dolor|Dad|01:45 
    [3] => 2013-03-09|sit|Dad|01:00 
    [4] => 2013-03-10|amet|Mom|01:45 
    [5] => 2013-03-11|Lorem|Mom|01:45 
    [6] => 2013-03-12|ipsum|Mom|01:00 
    [7] => 2013-03-13|dolor|Dad|01:45 
    [8] => 2013-03-14|sit|Mom|01:00 
    [9] => 2013-03-15|amet|Mom|01:45 
) 

發佈表單後,數組應該是這樣的:

Array 
(
    [0] => 2013-03-08|dolor|Dad|01:45 
    [1] => 2013-03-09|sit|Dad|01:00 
    [2] => 2013-03-10|amet|Mom|01:45 
    [3] => 2013-03-11|Lorem|Mom|01:45 
    [4] => 2013-03-12|ipsum|Mom|01:00 
) 

什麼將是實現這一目標的最簡單的方法?

有什麼想法?

/詹恩

+1

爲什麼你在同一個鍵上有多個值?打敗數組的全部用途。 – Tushar 2013-03-20 18:03:50

+0

array_filter()將是明顯的功能使用 – 2013-03-20 18:06:16

+0

你可以使用foreach和foreach你做一個子字符串,將前10個字母的子字符串轉換爲時間戳,並檢查時間戳位於用戶輸入,然後unset該值如果沒有或者像@MarkBaker那樣使用數組過濾器 – ITroubs 2013-03-20 18:06:21

回答

0

你可以這樣做:

設$日期是你輸入數組

$dates = array(
      '0' => '2013-03-06|Lorem|Mom|01:45', 
      '1' => '2013-03-07|ipsum|Dad|01:00', 
      '2' => '2013-03-08|dolor|Dad|01:45', 
      '3' => '2013-03-09|sit|Dad|01:00', 
      '4' => '2013-03-10|amet|Mom|01:45', 
      '5' => '2013-03-11|Lorem|Mom|01:45', 
      '6' => '2013-03-12|ipsum|Mom|01:00', 
      '7' => '2013-03-13|dolor|Dad|01:45', 
      '8' => '2013-03-14|sit|Mom|01:00', 
      '9' => '2013-03-15|amet|Mom|01:45)' 
     ); 


$startDate = "2013-03-08"; 
$endDate = "2013-03-12"; 

$new_startDate = strtotime($startDate); 
$new_endDate = strtotime($endDate); 

$user_dates = array(); 

foreach ($dates as $date) { 
    $date_values = explode('|', $date); 
    $current_date_value = $date_values[0]; 
    $current_date_value = strtotime($current_date_value); 

    if ($current_date_value >= $new_startDate && $current_date_value <= $new_endDate) { 
     $user_dates[] = $date; 
    } 
} 

$user_dates將持有你需要的日期

希望這可以幫助你:)

+0

謝謝你,先生。現在一切都說得通了。 – Janne 2013-03-20 20:30:24

2

我會建議使用array_filter()功能。

$startDate = strtotime('2013-03-08'); 
$endDate = strtotime('2013-03-12'); 

$array = array(...); // your input array 

$filteredArray = array_filter($array, function($value) use ($startDate, $endDate) { 
    $valArray = explode('|', $value); 
    $date = strtotime($valArray[0]); 
    return ($date >= $startDate && $date <= $endDate); 
}); 

注意上面的有效期爲PHP> = 5.3.0對於舊版本的你將有一個命名函數來代替匿名函數,並調用它像這樣:

$startDate = strtotime('2013-03-08'); 
$endDate = strtotime('2013-03-12'); 

$array = array(...); // your input array 

$filteredArray = array_filter ($array, 'filterArray'); 

function filterArray ($value) { 
    global $startDate; 
    global $endDate; 
    $valArray = explode('|', $value); 
    $date = strtotime($valArray[0]); 
    return ($date >= $startDate && $date <= $endDate); 
} 
+0

嗨邁克,我問了一個類似的問題,並看到這個代碼的作品,我的數組雖然是一個json_decoded數組,它有一個名爲date的鍵。它實際上是多個數組,我會更改'$ valArray = explode('|',$ value);'來獲取我的所有日​​期。示例代碼http://codepad.org/rSJMyMZl – Anagio 2013-08-20 10:44:39

+1

@Anagio首先,您可能會將'$ array ['results']'傳遞給函數,因爲這真的是您感興趣的內容。其次,您不再需要需要在函數中使用'explode()',因爲你已經有了'$ value'數組。你只需要比較'$ value ['date']'的值。請參閱此代碼示例http://codepad.org/fvPOVBkT請注意,在您的情況下,我已從'strtotime()'更改爲'DateTime :: createDateFromFormat()',因爲您的日期格式不是'strtotime()'可以處理。這實際上並不在鍵盤中工作,顯然它不支持DateTime。 – 2013-08-20 15:34:59

+0

謝謝,我只是爲了'DateTime :: createDateFromFormat()'將php更新爲5.3。真的很感激! – Anagio 2013-08-20 18:20:10