0

PHP の多次元配列の並べ替えは、私にとって少し混乱を招きます。

私が持っているのは、ファイルjson_decode()から形成した配列です。.jsonp

各プライマリ配列エントリにはいくつかの変数があります。それらには、「年」、「月」、「日」、「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()を使用して、Month、Day、Year、Hour、Minute パラメーターから時間 (エポックからの秒数) を作成できます。

このようなものがあなたの問題を解決します:

    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

まず、「もの」の配列を取得し、その「もの」を日付で並べ替えたいとします。

過去の日付が将来の日付よりも小さい数値になるように、何かを並べ替えるには、それを数値に変換する必要があります。これらのプロパティを持つ値の 1 つは、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 に答える