【问题标题】:How to sort array by order status如何按订单状态对数组进行排序
【发布时间】:2019-11-22 07:51:44
【问题描述】:

我有一个包含日期、状态和总和的数组:

Array
(
    [0] => Array
        (
            [date] => 2019-07-06 14:01:52
            [status] => paid
            [summ] => 100

        )

    [1] => Array
        (
            [date] => 2019-07-02 12:22:31
            [summ] => 320
            [status] => pending
        )

    [2] => Array
        (
            [date] => 2019-07-01 18:43:58
            [summ] => 100
            [status] => pending
        )

    [3] => Array
        (
            [date] => 2019-06-26 14:01:52
            [status] => canceled
            [summ] => 200
        )

我需要先按状态(1.pending、2.paid、3.canceled)对这个数组进行排序,然后按日期(顶部是新的)。

我订的订单:

待定 2019-07-02 12:22:31 待定 2019-07-01 18:43:58 付费时间 2019-07-06 14:01:52 取消 2019-06-26 14:01:52

日期我没有任何问题:

usort($new11, function($a, $b) {
    return strtotime($b['date']) - strtotime($a['date']);
});

但是如何按我需要的顺序按状态排序?

谢谢:)

【问题讨论】:

标签: php arrays


【解决方案1】:

你可以使用Spaceship:

<?php

    $new11 = [
        [
            'date' => '2019-07-06 14:01:52',
            'status' => 'paid',
            'summ' => 100,
        ],
        [
            'date' => '2019-07-02 12:22:31',
            'status' => 'pending',
            'summ' => 320,
        ],
        [
            'date' => '2019-07-01 18:43:58',
            'status' => 'pending',
            'summ' => 100,
        ],
        [
            'date' => '2019-06-26 14:01:52',
            'status' => 'canceled',
            'summ' => 200,
        ],
    ];

    $pending = 3;
    $paid = 2;
    $canceled = 1;

    usort($new11, function($a, $b) use ($pending, $paid, $canceled) {
        return (${$b['status']} <=> ${$a['status']}) * 10 +
               (strtotime($b['date']) <=> strtotime($a['date']));
    });


    var_dump($new11);

demo

【讨论】:

  • ${$a['status']}) * 10 为什么是 10?:)
  • @AlexB 因为 返回 -1,1 或 0 :) 所以摘要过滤器将是 (-1,0,1) * 10 + (-1,0,1)跨度>
【解决方案2】:

您可以简单地使用array_multisort 来实现它:

$test = [
    [
        'date' => '2019-07-06 14:01:52',
        'status' => 'paid',
        'summ' => 100,
    ],
    [
        'date' => '2019-07-02 12:22:31',
        'status' => 'pending',
        'summ' => 320,
    ],
    [
        'date' => '2019-07-01 18:43:58',
        'status' => 'pending',
        'summ' => 100,
    ],
    [
        'date' => '2019-06-26 14:01:52',
        'status' => 'canceled',
        'summ' => 200,
    ],
];

array_multisort(
    array_column($test, 'status'),
    SORT_DESC,
    array_column($test, 'date'),
    SORT_DESC,
    $test
);

var_dump($test);

结果是:

array(4) {
  [0]=>
  array(3) {
    ["date"]=>
    string(19) "2019-07-02 12:22:31"
    ["status"]=>
    string(7) "pending"
    ["summ"]=>
    int(320)
  }
  [1]=>
  array(3) {
    ["date"]=>
    string(19) "2019-07-01 18:43:58"
    ["status"]=>
    string(7) "pending"
    ["summ"]=>
    int(100)
  }
  [2]=>
  array(3) {
    ["date"]=>
    string(19) "2019-07-06 14:01:52"
    ["status"]=>
    string(4) "paid"
    ["summ"]=>
    int(100)
  }
  [3]=>
  array(3) {
    ["date"]=>
    string(19) "2019-06-26 14:01:52"
    ["status"]=>
    string(8) "canceled"
    ["summ"]=>
    int(200)
  }
}

DEMO

【讨论】:

  • 你是如何设置状态优先级的?
  • @AlexB 他只是按字母顺序排序,但从 z 到 a 降序
【解决方案3】:

你快到了。您可以有一个分配了值的优先级数组。然后,您可以进行简单的数学运算来判断结果。

<?php

usort($new11, function($a, $b) {
    $priority = [
                    'pending' => 1,
                    'paid' => 2,
                    'canceled' => 3
                ];

    $result = $priority[$a['status']] - $priority[$b['status']];
    if($result === 0) return strtotime($b['date']) - strtotime($a['date']);
    return $result;    
});

【讨论】:

    【解决方案4】:

    您可以使用asort 对其进行排序,它按字母顺序排列。

    如果您需要它具有特定的状态顺序,我建议使用 int 值来引用状态。可以使用一些约束来定义它们

    【讨论】:

    • 想法!:) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2023-01-10
    • 1970-01-01
    • 2016-03-04
    • 2021-06-05
    相关资源
    最近更新 更多