PHP从JSON排序多维数组

PHP从JSON排序多维数组,php,arrays,json,sorting,multidimensional-array,Php,Arrays,Json,Sorting,Multidimensional Array,PHP多维数组排序对我来说有点混乱 我拥有的是一个数组,它由.jsonp文件中的json\u decode()组成 它在每个主数组条目中都有几个变量。它们包括“年”、“月”、“日”、“小时开始”和“分钟开始”,以及一些其他信息 我想按日期对这个数组进行排序,所以我想先按“minuteTimeStart”、“hourTimeStart”、“Day”、然后“Month”再“Year”进行排序,所以它们是按时间顺序排列的 该数组如下所示: Array ( [0] => Array ( [Yea

PHP多维数组排序对我来说有点混乱

我拥有的是一个数组,它由
.jsonp
文件中的
json\u decode()
组成

它在每个主数组条目中都有几个变量。它们包括“年”、“月”、“日”、“小时开始”和“分钟开始”,以及一些其他信息

我想按日期对这个数组进行排序,所以我想先按“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
进行排序

您可以使用它来提供一个自定义比较函数,并根据您的月、日、年、小时、分钟参数构建时间(以秒为单位)

类似这样的方法可以解决您的问题:

    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");
您可以使用提供自定义比较函数,并根据月、日、年、小时、分钟参数构建时间(从纪元开始以秒为单位)

类似这样的方法可以解决您的问题:

    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");

首先,你有一个数组的“东西”,你想排序的“东西”的日期

要对某物进行排序,需要将其转换为一个数字,以便过去的日期比未来的日期低。具有这些属性的一个值是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现在已排序。

首先,您有一个“stuff”数组,您希望按日期对“stuff”进行排序

要对某物进行排序,需要将其转换为一个数字,以便过去的日期比未来的日期低。具有这些属性的一个值是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现在已排序。

这不是问题。没有
。这只是一个需求列表。你可能会想阅读,这是你最终可能用来完成你的要求的东西。可能的重复-我也从一开始就删除了两个分散注意力的句子,因为它总是像前面所概述的那样工作(我们在网站上有一些关于这个主题的非常好的问答)甚至我链接的问题下面也有一个很好的注释,这是你面临的约会问题的一个很好的指针。@hakre我认为这与多维数组无关,OP不知道如何使用自定义比较函数获取数组值的详细信息,并以某种方式对其进行操作,以便在自定义比较器中使用它。@jbx:它始终是多排序的。与其比较该数组中的所有对,不如将该数组映射到排序值(每个条目一个操作),然后对这些排序值使用multisort。就像在副本中概述的一样,它不是多重排序,在本例中,它只是碰巧值是数组,但它们可能只是没有自然排序的对象。您建议的答案是重复使用
array\u multisort()
,它只采用一些排序标准(升序、降序、自然等),而不是此处所需的自定义排序函数(需要将年、月、日、小时、分钟字段合并为一个值以使其具有可比性)。这不是问题。没有
。这只是一个需求列表。你可能会想阅读,这是你最终可能用来完成你的要求的东西。可能的重复-我也从一开始就删除了两个分散注意力的句子,因为它总是像前面所概述的那样工作(我们在网站上有一些关于这个主题的非常好的问答)甚至我链接的问题下面也有一个很好的注释,这是你面临的约会问题的一个很好的指针。@hakre我认为这与多维数组无关,OP不知道如何使用自定义比较函数获取数组值的详细信息,并以某种方式对其进行操作,以便在自定义比较器中使用它。@jbx:它始终是多排序的。与其比较该数组中的所有对,不如将该数组映射到排序值(每个条目一个操作),然后对这些排序值使用multisort。就像在副本中概述的一样,它不是多重排序,在本例中,它只是碰巧值是数组,但它们可能只是没有自然排序的对象。您建议的答案是重复使用
array\u multisort()
,它只采用一些排序标准(升序、降序、自然等),而不是此处要求的自定义排序函数(需要将年、月、日、小时、分钟字段组合成一个值以使其具有可比性)。我理解
$ar1
是什么,但是什么是
$ar2
usort
会将每个元素传递到回调函数
myDateSort
,以便您可以相互比较。为了比较一个元素和另一个元素,需要两个参数。