2015-04-04 60 views
0

我有一個時間戳(作爲關鍵字)和字符串(作爲值)的數組。
我想獲得數組的所有元素,其中時間戳在特定的月份。
例如:2015年 - 4月:從2015年4月0日零時起至2015年4月30日23時59分。獲取時間戳在特定月份的時間戳數組的元素

這樣做的最佳方法是什麼?我應該先用ksort排序我的陣列,還是讓它變慢?

編輯:我的數組的轉儲:

array(327) { [1428226200]=> string(95) "foo" [1428231600]=> string(95) "bar" ... } 

我也可以很容易地得到一個這樣的數組,如果它的更好:

array(327) { ["2014/03/05 09:30"]=> string(95) "foo" ["2015/04/07 11:00"]=> string(95) "bar" ... } 
+1

其中是你的陣列的轉儲,你試過什麼 – Ghost 2015-04-04 10:52:18

回答

3

轉換的時間戳的日期和比較反對格式化月:

$dates = /* your array */ 
$aprilDates = []; 
foreach ($dates as $timestamp => $value) { 
    $date = new \DateTime("@$timestamp"); 
    if ($date instanceof \DateTime && $date->format('m') == 4) { 
     $aprilDates[$timestamp] = $value; 
    } 
} 

Online Demo

相反的\DateTime,您還可以使用date功能:

foreach ($dates as $timestamp => $value) { 
    if (date('m', $timestamp) == 2) { 
     $aprilDates[$timestamp] = $value; 
    } 
} 

還有另一個選擇:

$startDate = strtotime('first day of April'); 
$endDate = strtotime('last day of April 23:59:59'); 

foreach ($dates as $timestamp => $value) { 
    if ($timestamp >= $startDate && $timestamp <= $endDate) { 
     echo $value, PHP_EOL; 
    } 
} 

關於你的問題

要我用ksort第一排序我的數組,還是讓它變慢?

首先對數組進行排序將對數組執行一次額外的迭代。這意味着是的,它會變慢。在那裏只有幾百件物品,但它可能沒有明顯的區別。

+0

像魔術一樣工作!謝謝。 (只需要將'&& $ date-> format('Y')== 2015'添加到'if'。 – Koli 2015-04-04 11:29:04

+0

@Koli也可以做' - > format('Y-m')==='2015- 04'' – Gordon 2015-04-04 11:33:53

+0

或者對於第三個選項:'$ startDate = strtotime('2015年4月的第一天');''和'$ endDate = strtotime('2015年4月23:59:59'的最後一天);' – Koli 2015-04-04 11:53:38