在优先级php中按键值排序数组

在优先级php中按键值排序数组,php,arrays,sorting,Php,Arrays,Sorting,我有一个结果数组。现在我想以排序的方式在网格中显示结果。因此我需要改变这个数组 排序需要如下“订单”-“预订单”-“已关闭” 但是我还有一个“sort”值,所以我想首先对3种打开状态类型进行排序,然后在这些类型中对排序值进行排序,例如数组: $arr = [ 0 => ['id'=>1, 'sort'=>2, 'status'=>'closed', 'name'=>'some name...'],

我有一个结果数组。现在我想以排序的方式在网格中显示结果。因此我需要改变这个数组

排序需要如下“订单”-“预订单”-“已关闭” 但是我还有一个“sort”值,所以我想首先对3种打开状态类型进行排序,然后在这些类型中对排序值进行排序,例如数组:

            $arr = [
            0 => ['id'=>1, 'sort'=>2, 'status'=>'closed', 'name'=>'some name...'],
            1 => ['id'=>2, 'sort'=>1, 'status'=>'closed', 'name'=>'some name...'],
            2 => ['id'=>3, 'sort'=>3, 'status'=>'open', 'name'=>'some name...'],
            3 => ['id'=>4, 'sort'=>5, 'status'=>'pre-order', 'name'=>'some name...'],
            4 => ['id'=>5, 'sort'=>4, 'status'=>'closed', 'name'=>'some name...'],
            5 => ['id'=>6, 'sort'=>6, 'status'=>'pre-order', 'name'=>'some name...'],
            6 => ['id'=>7, 'sort'=>7, 'status'=>'pre-order', 'name'=>'some name...'],
            7 => ['id'=>8, 'sort'=>9, 'status'=>'open', 'name'=>'some name...'],
            8 => ['id'=>9, 'sort'=>8, 'status'=>'open', 'name'=>'some name...'],
            9 => ['id'=>10, 'sort'=>10, 'status'=>'closed', 'name'=>'some name...'],
            10 => ['id'=>11, 'sort'=>11, 'status'=>'closed', 'name'=>'some name...'],
        ];

我通过几个循环将类型添加到检查打开状态的新数组来编辑它,但我无法使它与排序一起工作。

您可以使用
usort
来完成此操作

$arr = [
    0 => ['id'=>1, 'sort'=>2, 'status'=>'closed', 'name'=>'some name...'],
    1 => ['id'=>2, 'sort'=>1, 'status'=>'closed', 'name'=>'some name...'],
    2 => ['id'=>3, 'sort'=>3, 'status'=>'open', 'name'=>'some name...'],
    3 => ['id'=>4, 'sort'=>5, 'status'=>'pre-order', 'name'=>'some name...'],
    4 => ['id'=>5, 'sort'=>4, 'status'=>'closed', 'name'=>'some name...'],
    5 => ['id'=>6, 'sort'=>6, 'status'=>'pre-order', 'name'=>'some name...'],
    6 => ['id'=>7, 'sort'=>7, 'status'=>'pre-order', 'name'=>'some name...'],
    7 => ['id'=>8, 'sort'=>9, 'status'=>'open', 'name'=>'some name...'],
    8 => ['id'=>9, 'sort'=>8, 'status'=>'open', 'name'=>'some name...'],
    9 => ['id'=>10, 'sort'=>10, 'status'=>'closed', 'name'=>'some name...'],
    10 => ['id'=>11, 'sort'=>11, 'status'=>'closed', 'name'=>'some name...'],
];

usort($arr, function($a, $b) {
    if ($a['status'] == $b['status']) return $b['sort'] - $a['sort'];
    else {
        if ($a['status'] == "open") return -1;
        else if ($b['status'] == "open") return 1;
        else if ($a['status'] == "pre-order")  return -1;
        else return 1;
    }
});

var_dump($arr);
另一种方法是:

或者根本没有:

$result = [];
$status = ['open'=>1e5, 'pre-order'=>2e5, 'closed'=>3e5];
foreach ($arr as &$v) {
    $key = $status[$v['status']] + $v['sort'];
    $result[$key] = $v;
}
ksort($result);
$result = array_values($result);

这是一个固定数组或sql查询结果?@r2get dupe page建议的实现:
$result = [];
$status = ['open'=>1e5, 'pre-order'=>2e5, 'closed'=>3e5];
foreach ($arr as &$v) {
    $key = $status[$v['status']] + $v['sort'];
    $result[$key] = $v;
}
ksort($result);
$result = array_values($result);