0

PHP 多维数组排序让我有点困惑。

我所拥有的是json_decode().jsonp文件中形成的数组。

它在每个主数组条目中有几个变量。它们包括“Year”、“Month”、“Day”、“hourTimeStart”和“minuteTimeStart”,以及其他一些信息。

我想按日期对这个数组进行排序,所以我想先按“minuteTimeStart”、“hourTimeStart”、“Day”排序,然后是“Month”,然后是“Year”,所以它们是按时间顺序排列的。

数组如下所示:

Array ( 
[0] => Array ( [Year] => 2013 [Month] => February [Day] => 5 [hourTimeStart] => 5 [minuteTimeStart] => 0 [Name] => tht ) 
[1] => Array ( [Year] => 2013 [Month] => January [Day] => 6 [hourTimeStart] => 2 [minuteTimeStart] => 0 [Name] => gregre) 
[2] => Array ( [Year] => 2013 [Month] => March [Day] => 4 [hourTimeStart] => 1 [minuteTimeStart] => 15 [Name] => gregre)
)

基本上我正在做的是:

$databaseFileURL = "../Appointments/AllAppointmentData.jsonp";
    if(file_exists($databaseFileURL)){
        $jsonAppointmentData = file_get_contents($databaseFileURL);
    } else $jsonAppointmentData = "";
    $AppointmentData = json_decode($jsonAppointmentData, true);

然后我想$AppointmentData按每个子数组中指示的日期排序

4

2 回答 2

2

您可以使用usort()提供自定义比较函数,并使用mktime( ) 从您的月、日、年、小时、分钟参数构建时间(从纪元开始的秒数)。

这样的事情可以解决你的问题:

    function myDateSort($ar1, $ar2)
    {
       $month1 = //todo: convert $ar1['Month'] string to the corresponding month number
       $date1 = mktime($ar1['hourTimeStart'], $ar1['minuteTimeStart'], 0,  $month1, $ar1['Day'], $ar1['Year'] );

       $month2 = //todo: convert $ar2['Month'] string to the corresponding month number
       $date2 = mktime($ar2['hourTimeStart'], $ar2['minuteTimeStart'], 0,  $month2, $ar2['Day'], $ar2['Year'] );

       //this will sort ascending, change it to $date2 - $date1 for descending
       return $date1 - $date2;
    }

然后做:

usort($AppointmentData, "myDateSort");
于 2013-08-28T20:23:44.957 回答
2

首先,您有一个“东西”数组,并且您想按日期对“东西”进行排序。

要对某些内容进行排序,您需要将其转换为数字,以便过去的日期比未来的日期小。具有这些属性的一个值是 UNIX 时间戳。

您的资料具有以下构成资料日期的属性:

[Year] => 2013  [Month] => February [Day] => 5 
[hourTimeStart] => 5 [minuteTimeStart] => 0 

所以你需要创建一个函数,把东西的日期变成时间戳。因为这将是一个不同的问题(不用担心,这已经被回答过,所以代码就在那里),我只模拟这样一个函数:

$stuffToTimestamp = function(array $stuff) {
    $timestamp = ... // do whatever needs to be done to turn 
                     // $stuff into a timestamp
    return $timestamp;
}

所以现在有了这个函数,你可以为每个$stuff. 这就是你现在要做的:

$sortKeys = array_map($stuffToTimestamp, $AppointmentData);

然后对数据进行排序:

array_multisort($AppointmentData, $sortKeys);

这已经是了。$AppointmentData现在已排序。

于 2013-08-28T20:47:18.823 回答