2017-08-17 2 views
0

Zuerst einmal bin ich ein kompletter Neuling zu diesem JSON, ich habe nach Lösungen gesucht, aber scheinen, dass ich den Trick nicht gefunden habe.JSON Sortierung nach Datum

Wo Daten wie folgt aussieht:

Array 
(
    [0] => Array 
     (
      [debtor_name] => Name 1 
      [debtor_number] => 0001 
      [statement_date] => 7/31/17 
      [statement_period] => 07/01/2017 - 07/31/2017 
      [due_date] => 8/31/17 
      [statement_number] => 2017-07-0001 
      [courier] => Handcarry 
      [outstanding_bal] => 3,647.53 
      [bal_br_fwd] => 3,647.16 
      [age_cur] => 3,647.53 
      [age_30] => 0 
      [age_60] => 0 
      [age_90] => 0 
      [age_120] => 0 
      [password] => 11291934 
      [email] => [email protected] 
      [counter] => 1 
      [transList] => Array 
       (
        [0] => Array 
         (
          [lineOrder] => 0 
          [date] => 7/1/17 
          [dateNum] => 1498838400000 
          [ref] => 0000484236 
          [amt] => 7231.16 
          [desc] => MD-MONTHLY DUES 
          [debit] => 3584 
          [credit] => 0 
         ) 

        [1] => Array 
         (
          [lineOrder] => 1 
          [date] => 7/15/17 
          [dateNum] => 1500048000000 
          [ref] => 0000165008 
          [amt] => 3684 
          [desc] => CM-METROBANK 
          [debit] => 0 
          [credit] => 3647.16 
         ) 

        [2] => Array 
         (
          [lineOrder] => 2 
          [date] => 7/15/17 
          [dateNum] => 1500048000000 
          [ref] => 0000165008 
          [amt] => 3647.53 
          [desc] => 1% Discount 
          [debit] => 0 
          [credit] => 36.47 
         ) 

        [3] => Array 
         (
          [lineOrder] => 3 
          [date] => 7/1/17 
          [dateNum] => 1498838400000 
          [ref] => 0000484237 
          [amt] => 7331.16 
          [desc] => MD-VALLEY SENIORS FEE 
          [debit] => 100 
          [credit] => 0 
         ) 

       ) 

     ) 

    [1] => Array 
     (
      [debtor_name] => Name 2 
      [debtor_number] => 2665 
      [statement_date] => 7/31/17 
      [statement_period] => 07/01/2017 - 07/31/2017 
      [due_date] => 8/31/17 
      [statement_number] => 2017-07-2665 
      [courier] => Sure Mail 
      [outstanding_bal] => 18,194.93 
      [bal_br_fwd] => 17,897.63 
      [age_cur] => 5,193.00 
      [age_30] => 6,196.01 
      [age_60] => 4,984.71 
      [age_90] => 1,821.21 
      [age_120] => 0 
      [password] => 05291962 
      [email] => [email protected] 
      [counter] => 5372 
      [transList] => Array 
       (
        [0] => Array 
         (
          [lineOrder] => 4 
          [date] => 7/1/17 
          [dateNum] => 1498838400000 
          [ref] => 0000479082 
          [amt] => 18082.63 
          [desc] => F&B CONCESSIONAIRE-F&B 015904 JJ 
          [debit] => 185 
          [credit] => 0 
         ) 

        [1] => Array 
         (
          [lineOrder] => 5 
          [date] => 7/1/17 
          [dateNum] => 1498838400000 
          [ref] => 0000485742 
          [amt] => 21666.63 
          [desc] => MD-MONTHLY DUES 
          [debit] => 3584 
          [credit] => 0 
         ) 

        [2] => Array 
         (
          [lineOrder] => 6 
          [date] => 7/1/17 
          [dateNum] => 1498838400000 
          [ref] => 0000485743 
          [amt] => 21890.63 
          [desc] => MD-LOCKER RENTAL 
          [debit] => 224 
          [credit] => 0 
         ) 

        [3] => Array 
         (
          [lineOrder] => 7 
          [date] => 7/1/17 
          [dateNum] => 1498838400000 
          [ref] => 0000481000 
          [amt] => 21920.63 
          [desc] => F&B CONCESSIONAIRE-F&B 026492 ANIX 
          [debit] => 30 
          [credit] => 0 
         ) 

        [4] => Array 
         (
          [lineOrder] => 8 
          [date] => 7/31/17 
          [dateNum] => 1501430400000 
          [ref] => PF00072305 
          [amt] => 18194.93 
          [desc] => PATRONAGE FEE 
          [debit] => 0 
          [credit] => 448 
         ) 

        [5] => Array 
         (
          [lineOrder] => 9 
          [date] => 7/6/17 
          [dateNum] => 1499270400000 
          [ref] => 0000481002 
          [amt] => 22010.63 
          [desc] => F&B CONCESSIONAIRE-F&B 027375 ANIX 
          [debit] => 15 
          [credit] => 0 
         ) 

        [6] => Array 
         (
          [lineOrder] => 10 
          [date] => 7/8/17 
          [dateNum] => 1499443200000 
          [ref] => 0000479083 
          [amt] => 22268.63 
          [desc] => F&B CONCESSIONAIRE-F&B 016332 JJ 
          [debit] => 258 
          [credit] => 0 
         ) 

        [7] => Array 
         (
          [lineOrder] => 11 
          [date] => 7/8/17 
          [dateNum] => 1499443200000 
          [ref] => 0000164358 
          [amt] => 17372.93 
          [desc] => CM-METROBANK 
          [debit] => 0 
          [credit] => 4895.7 
         ) 

        [8] => Array 
         (
          [lineOrder] => 12 
          [date] => 7/15/17 
          [dateNum] => 1500048000000 
          [ref] => 0000481003 
          [amt] => 17422.93 
          [desc] => F&B CONCESSIONAIRE-F&B 028985 ANIX 
          [debit] => 50 
          [credit] => 0 
         ) 

        [9] => Array 
         (
          [lineOrder] => 13 
          [date] => 7/15/17 
          [dateNum] => 1500048000000 
          [ref] => 0000479084 
          [amt] => 17735.93 
          [desc] => F&B CONCESSIONAIRE-F&B 016716 JJ 
          [debit] => 313 
          [credit] => 0 
         ) 

        [10] => Array 
         (
          [lineOrder] => 14 
          [date] => 7/22/17 
          [dateNum] => 1500652800000 
          [ref] => 0000478834 
          [amt] => 18289.93 
          [desc] => F&B CONCESSIONAIRE-08528DR 
          [debit] => 554 
          [credit] => 0 
         ) 

        [11] => Array 
         (
          [lineOrder] => 15 
          [date] => 7/29/17 
          [dateNum] => 1501257600000 
          [ref] => 0000479085 
          [amt] => 18642.93 
          [desc] => F&B CONCESSIONAIRE-F&B 017434 JJ 
          [debit] => 353 
          [credit] => 0 
         ) 

        [12] => Array 
         (
          [lineOrder] => 16 
          [date] => 7/1/17 
          [dateNum] => 1498838400000 
          [ref] => 0000481001 
          [amt] => 21995.63 
          [desc] => F&B CONCESSIONAIRE-F&B 026713 ANIX 
          [debit] => 75 
          [credit] => 0 
         ) 

       ) 

     ) 

) 

Also bin ich die Daten bekommen wie dieses

$json = json_decode($_POST["list"], true); 

ich diese Codezeile versucht, aber scheint nicht funktioniert:

function sort_by_date($a, $b) { 
    $a = strtotime($a['date']); 
    $b = strtotime($b['date']); 
    return ($a < $b) ? -1 : 1; 
} 
usort($json, 'sort_by_date'); 

Ich versuche, dieses JSON-Array nach Datum in TransList-Array zu sortieren, aber ich weiß nicht wirklich, wie ich diese Variablen nennen sollte e auf dem Array, werden alle Tipps in die richtige Richtung sehr geschätzt!

+0

'usort ($ json [0 ... n] [ 'transList'], 'sort_by_date');' – Spectarion

+0

Was ist das $ json [0 ... n]? – rolex

+0

Sie müssen alle $ json-Elemente durchlaufen und das TransList-Array jedes Elements sortieren. 'usort ($ json [0] ['transList'], 'sort_by_date');' 'usort ($ json [1] ['transList'], 'sort_by_date');' 'usort ($ json [2] [' transList '],' sort_by_date '); '... – Spectarion

Antwort

1

Dies sortiert die Felder in jedem transList:

foreach($json as $k => $v) 
{ 
    usort($v['transList'], function($a, $b){ 
     $d1 = new DateTime($a['date']); 
     $d2 = new DateTime($b['date']); 
     if($d1 == $d2){ 
      return 0; 
     } 
     return ($d1 < $d2) ? -1 : 1; 
    }); 

    // For testing purposes, the array is print to screen to show sorting worked as required 
    echo '<pre>'; 
    print_r($v['transList']); 
    echo '</pre>'; 
} 

Und nur zu Testzwecken, habe ich die folgenden Daten, um Ihre Daten zu verspotten:

$json = [ 
    [ 
     'transList' => [ 
      [ 
       'id' => 'a', 
       'date' => '7/15/17' 
      ], 
      [ 
       'id' => 'b', 
       'date' => '2/15/17' 
      ], 
      [ 
       'id' => 'c', 
       'date' => '7/15/16' 
      ], 
      [ 
       'id' => 'd', 
       'date' => '4/15/12' 
      ], 
      [ 
       'id' => 'e', 
       'date' => '3/15/16' 
      ] 
     ] 
    ], 
    [ 
     'transList' => [ 
      [ 
       'id' => 'd', 
       'date' => '7/15/17' 
      ], 
      [ 
       'id' => 'b', 
       'date' => '2/15/17' 
      ], 
      [ 
       'id' => 'g', 
       'date' => '7/15/16' 
      ], 
      [ 
       'id' => 'a', 
       'date' => '4/15/12' 
      ], 
      [ 
       'id' => 'x', 
       'date' => '3/15/16' 
      ] 
     ] 
    ] 
]; 

Um Ihre Frage zu beantworten, über die weitere Sortierung nach Betrag, wenn das Datum ist gleich:

foreach($json as $k => $v) 
{ 
    usort($v['transList'], function($a, $b){ 
     $d1 = new DateTime($a['date']); 
     $d2 = new DateTime($b['date']); 
     if($d1 == $d2){ 
      if($a['amt'] == $b['amt']){ 
       return 0; 
      } 
      return ($a['amt'] < $b['amt']) ? -1 : 1; 
     } 
     return ($d1 < $d2) ? -1 : 1; 
    }); 

    // For testing purposes, the array is print to screen to show sorting worked as required 
    echo '<pre>'; 
    print_r($v['transList']); 
    echo '</pre>'; 
} 
+0

Wenn die Daten dasselbe Datum haben, wird die Position vertauscht. Ist es möglich, eine Bedingung hinzuzufügen, die nach Datum und Amt oder Datum und ID sortiert ist? – rolex

+0

Siehe überarbeitete Antwort, jetzt hat Beispiel für weitere Sortierung von amt, wenn Datum gleich ist. –

+0

Perfekt. Vielen Dank für Ihre Hilfe. – rolex