2016-07-25 56 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个事件没有超过结束日期.... –