2016-07-25 46 views
0

試圖通過「結束」來排序下面的數組而不使用usort函數,是否有一種簡單的方法可以這樣做?簡單的PHP數組按照子數組鍵排序

$feature_event = array(
    array(
     "title"  => "Classic", 
     "date"  => "October 28 - 30 2016", 
     "end"  => strtotime("October 30, 2016") 
    ), 
    array(
     "title"  => "Ski Weekend", 
     "date"  => "February 5-8, 2017", 
     "end"  => strtotime("February 8, 2017") 
    ), 
    array(
     "title"  => "NBA Weekend", 
     "date"  => "February 17-19, 2017", 
     "end"  => strtotime("February 19, 2017") 
    ), 
    array(
     "title"  => "Fiesta", 
     "date"  => "May 26-28, 2017", 
     "end"  => strtotime("May 28, 2017") 
    ) 

我通過foreach循環輸出結果,但想限制爲3個結果。

<?php foreach(array_slice($feature_event, 0, 3) as $event): ?> 
... 
<?php endforeach; ?> 

小的解釋: 我試圖顯示與事件相關的圖像。每個事件都有一個特定的結束日期。一旦結束日期過去,顯示循環中的下一個圖像......但我希望數組按照結束日期排序。我明白一個usort函數可以做到這一點,但我並沒有在編碼方面取得進展。有沒有簡單的方法來完成「結束」排序或我需要做一個usort。如果需要使用usort,我仍然需要forloop? Plz原諒我愚蠢的問題。

UPDATE

這個數組multisort解決方案

array_multisort(array_column($feature_event, 'end'), $feature_event); 

各種我需要它,但我想輸出基於截止當前日期的數據的方式......我可以」不像是會創建一個條件即正常工作......

我的for循環中我有這樣的條件:

<?php 
date_default_timezone_set("America/Chicago"); 
$now = strtotime("now"); 
?> 

<?php if($now <= $event["end"]) :?> 
    ... code ... 
<?php endif;?> 

但它只輸出2個事件....任何想法我做錯了什麼。這個如果在上面的foreachloop裏面。

+1

這是從一個數據庫?爲什麼不從那裏進行限制和排序,沒有更多'array_slice'和'usort' – Ghost

+0

這是一個小型網站的靜態數據。這是一種基於不涉及使用usort的子數組的關鍵在PHP中排序和限制的方法嗎?正如我所說,我寧願一個簡單的解決方案,但如果有更好的選擇多一點進步,那麼我不會反對它。 –

+0

編輯答案,我誤讀了'strtotime()'部分。 – AbraCadaver

回答

1

由於end值是時間戳,只是提取那些到一個數組和那種,排序原數組:

PHP < 5.5.0:

array_multisort(
    array_map(function($v) { return $v['end']; }, $feature_event), $feature_event); 

PHP> = 5.5 .0

array_multisort(array_column($feature_event, 'end'), $feature_event); 

或使用SORT_DESC作爲第三個參數,取決於您想要排序的方式。

然後用你的array_slice()得到第一個或最後3個循環。

+0

不錯,這種排序正確。我做了一個數組的print_r並檢查。我現在唯一的問題是創建正確的條件從基於當前日期和結束日期的循環輸出數據...所以基本上,最近3個事件沒有超過結束日期.... –