2016-11-14 142 views
0

我有一個數組,其日期作爲鍵和價格作爲值。就像這樣:過濾PHP數組鍵和計算平均值

Array 
(
    [2016-11-11] => 25.05 
    [2016-11-12] => 25.05 
    [2016-11-13] => 25.05 
    [2016-11-14] => 25.05 
    ... 
) 

現在我需要計算今天的平均值 - 1到今天 - 8。當然也應該正確地計算,如果有小於8項。

我正在考慮提取鍵和過濾器的值,並把所有的循環。但我敢打賭,會有更好的方式。我至少很高興能夠從一開始就瞭解一個方向。你可以幫我嗎?

「今天」我這樣定義的:

date_default_timezone_set("Europe/Berlin"); 
$timestamp = time();   
$today = date("Y-m-d",$timestamp); 

編輯: 輸出應該像

$last_week_mean = "value" of key[today-1] + "value" of key [today-2] 

+ .../count(amount of key values in this range) 

但我不知道如何建立這樣的查詢/過濾器 - 事:)

+1

那麼確切的問題是什麼? –

+0

您能否提供例外輸出以及查詢? @FabrizioCocco –

回答

1

您可以使用array_filterARRAY_FILTER_USE_KEY來獲得所需的特定日期範圍。但在此之後,您不需要使用循環來計算平均值。您可以使用已過濾數組的總和/數量。

$d1 = date('Y-m-d', strtotime('8 days ago')); 
$d2 = date('Y-m-d', strtotime('1 day ago')); 

$range = array_filter($your_array, function($date_string) use ($d1, $d2) { 
    return $date_string >= $d1 && $date_string <= $d2; 
}, ARRAY_FILTER_USE_KEY); 

$average = array_sum($range)/count($range); 

而且,萬一你從數據庫中獲取您最初的陣列,這很可能會更容易,更高效,只選擇要開始的日期。

+0

這正是我正在尋找的。是的:有一個數據庫背後。我很不確定哪種方式會更好:)但是現在我留在你的代碼中。它工作真棒。 –

+1

@FabrizioCocco在數據庫中,您可以使用'SELECT AVG(price)FROM table where where between between ... AND ...' – Barmar

+0

@FabrizioCocco Barmar的建議幾乎肯定會比PHP方法更好。我真的建議看看它。 –