JSON按日期排序

时间:2017-08-17 03:06:36

标签: php arrays json sorting date

首先,我是这个json的完全新手,我已经寻找解决方案,但似乎我没有找到诀窍。

数据如下所示:

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] => rolex@bngtransmedia.com
            [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] => r.estemonio@gmail.com
            [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
                        )

                )

        )

)

所以我得到这样的数据

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

我尝试了这行代码,但似乎无法正常工作:

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

我试图按照日期在transList数组中对这个JSON数组进行排序,但我真的不知道我应该如何在数组上调用这个变量,非常感谢正确方向的任何提示!

1 个答案:

答案 0 :(得分:1)

这会对每个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>';
}

仅出于测试目的,我使用以下数据来模拟您的数据:

$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'
            ]
        ]
    ]
];

如果日期相同,请回答有关按金额进一步分类的问题:

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>';
}