2017-03-05 119 views
0

我有一个结果数组。现在我想以排序的方式在网格中显示结果。为此我需要改变这个数组。按优先级排序键值的数组php

排序需要像这样“订单” - “预购” - “关闭” 但我也有一个“排序”值,所以我想先排序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...'], 
     ]; 

我DIT它由几个循环添加类型的新数组检查开放的状态,但我不能使它与排序工作。

+0

这是一个固定的阵列或SQL查询结果? – hassan

回答

0

的另一种方式:

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

或不毕竟:

$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); 
1

您可以使用usort使用pack做到这一点

$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);