2017-03-05 122 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);