【问题标题】:Simple PHP Array Sorting by sub array key简单的PHP数组按子数组键排序
【发布时间】:2016-07-25 02:56:38
【问题描述】:

尝试在不使用 usort 函数的情况下按“end”对下面的数组进行排序,有没有简单的方法?

$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 函数可以解决问题,但我在编码方面并没有那么先进。有没有一种简单的方法可以通过“结束”完成排序,或者我需要做一个排序。如果需要一个排序,我还需要forloop吗?请原谅我的愚蠢问题。

更新

这个数组多排序解决方案

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

按我需要的方式排序,但我想根据当前日期输出数据...我似乎无法创建一个正常工作的条件...

在我的 forloop 中,我有这个条件:

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

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

但它只输出 2 个事件....关于我做错了什么的任何想法。这个 if 在上面的 foreach 循环中。

【问题讨论】:

  • 这是来自数据库吗?为什么不从那里进行限制和排序,没有更多的array_sliceusort
  • 这是一个小型网站的静态数据。它是一种基于不涉及使用 usort 的子数组的键在 php 中排序和限制的方法吗?正如我所说,我更喜欢一个简单的解决方案,但如果有更好的选择,那么我不会反对它。
  • 已编辑答案,我误读了strtotime() 部分。

标签: php sorting usort


【解决方案1】:

由于end 值是时间戳,只需将它们提取到一个数组中并对其进行排序,对原始数组进行排序:

PHP :

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 并循环。

【讨论】:

  • 很好,这排序正确。我做了一个数组的 print_r 并检查了。我现在唯一的问题是创建正确的条件以根据当前日期和结束日期从循环中输出数据......所以基本上,最近的 3 个未超过结束日期的事件......
猜你喜欢
  • 2013-03-20
  • 1970-01-01
  • 2011-01-29
  • 2018-11-11
  • 1970-01-01
  • 2023-03-18
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多