2017-09-02 29 views
1

我有一個StdClass對象數組,它包含幾種不同的車型(例如Compact Car,Minivan等),它們按價格排序。我想按照下面的順序排序的數組:我如何按特定列表順序對一個Std類對象進行排序?

  • 經濟轎車
  • 緊湊型轎車
  • 中級車
  • 標準尺寸轎車
  • 標準車
  • 高級汽車
  • 豪華車
  • 標準尺寸敞篷車
  • 中型SUV
  • 標準SUV
  • 全尺寸SUV
  • 麪包車
  • 剩餘車通過價格

排序我不知道,如果是有意義的解決這使用密鑰「描述」或「代碼」進行訂購。我已經想出瞭如何按價格排序,但不知道如何按照上面列出的順序重新排列數組。任何幫助,將不勝感激。謝謝!

輸入數組:

array (
    0 => 
    stdClass::__set_state(array(
     'description' => 'Mid-Size SUV', 
     'codes' => 
     array (
     0 => 'IFAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '30.31', 
    )), 
    1 => 
    stdClass::__set_state(array(
     'description' => 'Standard-Size SUV', 
     'codes' => 
     array (
     0 => 'SFAR', 
     1 => 'RFAR', 
    ), 
     'max_people' => '7', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '35.53', 
    )), 
    2 => 
    stdClass::__set_state(array(
     'description' => 'Specialty Vehicle', 
     'codes' => 
     array (
     0 => 'XXAR', 
    ), 
     'max_people' => false, 
     'min_people' => false, 
     'max_bags' => '', 
     'min_bags' => '', 
     'price' => '36.72', 
    )), 
    3 => 
    stdClass::__set_state(array(
     'description' => 'Compact Car', 
     'codes' => 
     array (
     0 => 'CCAR', 
     1 => 'CDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '4', 
     'max_bags' => '3', 
     'min_bags' => '1', 
     'price' => '37.21', 
    )), 
    4 => 
    stdClass::__set_state(array(
     'description' => 'Economy Car', 
     'codes' => 
     array (
     0 => 'ECAR', 
     1 => 'EDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '4', 
     'max_bags' => '2', 
     'min_bags' => '1', 
     'price' => '37.21', 
    )), 
    5 => 
    stdClass::__set_state(array(
     'description' => 'Mid-Size Car', 
     'codes' => 
     array (
     0 => 'ICAR', 
     1 => 'IDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '39.46', 
    )), 
    6 => 
    stdClass::__set_state(array(
     'description' => 'Standard-Size Car', 
     'codes' => 
     array (
     0 => 'SCAR', 
     1 => 'SDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '41.77', 
    )), 
    7 => 
    stdClass::__set_state(array(
     'description' => 'Minivan', 
     'codes' => 
     array (
     0 => 'MVAR', 
    ), 
     'max_people' => '7', 
     'min_people' => '7', 
     'max_bags' => '5', 
     'min_bags' => '2', 
     'price' => '43.18', 
    )), 
    8 => 
    stdClass::__set_state(array(
     'description' => 'Full-Size Car', 
     'codes' => 
     array (
     0 => 'FCAR', 
     1 => 'FDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '43.50', 
    )), 
    9 => 
    stdClass::__set_state(array(
     'description' => 'Compact SUV', 
     'codes' => 
     array (
     0 => 'CFAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '3', 
     'min_bags' => '3', 
     'price' => '46.42', 
    )), 
    10 => 
    stdClass::__set_state(array(
     'description' => 'Full-Size Hybrid', 
     'codes' => 
     array (
     0 => 'FCAH', 
    ), 
     'max_people' => false, 
     'min_people' => false, 
     'max_bags' => '', 
     'min_bags' => '', 
     'price' => '48.00', 
    )), 
    11 => 
    stdClass::__set_state(array(
     'description' => 'Standard-Size Convertible', 
     'codes' => 
     array (
     0 => 'STAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '4', 
     'min_bags' => '1', 
     'price' => '48.39', 
    )), 
    12 => 
    stdClass::__set_state(array(
     'description' => 'Sports Car', 
     'codes' => 
     array (
     0 => 'XSAR', 
     1 => 'SSAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '4', 
     'max_bags' => '3', 
     'min_bags' => '1', 
     'price' => '48.72', 
    )), 
    13 => 
    stdClass::__set_state(array(
     'description' => 'Premium Car', 
     'codes' => 
     array (
     0 => 'PCAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '4', 
     'min_bags' => '2', 
     'price' => '48.72', 
    )), 
    14 => 
    stdClass::__set_state(array(
     'description' => 'Luxury Car', 
     'codes' => 
     array (
     0 => 'LCAR', 
     1 => 'LDAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '5', 
     'min_bags' => '1', 
     'price' => '52.16', 
    )), 
    15 => 
    stdClass::__set_state(array(
     'description' => 'Full-Size SUV', 
     'codes' => 
     array (
     0 => 'FFAR', 
    ), 
     'max_people' => '8', 
     'min_people' => '7', 
     'max_bags' => '4', 
     'min_bags' => '2', 
     'price' => '52.92', 
    )), 
    16 => 
    stdClass::__set_state(array(
     'description' => 'Full-Size Van', 
     'codes' => 
     array (
     0 => 'FVAR', 
    ), 
     'max_people' => '15', 
     'min_people' => '12', 
     'max_bags' => '5', 
     'min_bags' => '1', 
     'price' => '90.38', 
    )), 
    17 => 
    stdClass::__set_state(array(
     'description' => 'Compact Convertible', 
     'codes' => 
     array (
     0 => 'CTAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '1', 
     'min_bags' => '1', 
     'price' => '91.17', 
    )), 
    18 => 
    stdClass::__set_state(array(
     'description' => 'Premium SUV', 
     'codes' => 
     array (
     0 => 'PFAR', 
     1 => 'UFAR', 
    ), 
     'max_people' => '7', 
     'min_people' => '5', 
     'max_bags' => '5', 
     'min_bags' => '1', 
     'price' => '92.64', 
    )), 
    19 => 
    stdClass::__set_state(array(
     'description' => 'Specialty Car', 
     'codes' => 
     array (
     0 => 'XCAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '3', 
     'min_bags' => '3', 
     'price' => '94.42', 
    )), 
    20 => 
    stdClass::__set_state(array(
     'description' => 'Mid-Size Convertible', 
     'codes' => 
     array (
     0 => 'ITAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '2', 
     'min_bags' => '2', 
     'price' => '97.98', 
    )), 
    21 => 
    stdClass::__set_state(array(
     'description' => 'Luxury SUV', 
     'codes' => 
     array (
     0 => 'LFAR', 
    ), 
     'max_people' => '5', 
     'min_people' => '5', 
     'max_bags' => '3', 
     'min_bags' => '3', 
     'price' => '113.66', 
    )), 
    22 => 
    stdClass::__set_state(array(
     'description' => 'Premium Convertible', 
     'codes' => 
     array (
     0 => 'PTAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '1', 
     'min_bags' => '1', 
     'price' => '121.15', 
    )), 
    23 => 
    stdClass::__set_state(array(
     'description' => 'Luxury Convertible', 
     'codes' => 
     array (
     0 => 'LTAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '1', 
     'min_bags' => '1', 
     'price' => '129.01', 
    )), 
    24 => 
    stdClass::__set_state(array(
     'description' => 'Premium Van', 
     'codes' => 
     array (
     0 => 'PVAR', 
    ), 
     'max_people' => '15', 
     'min_people' => '15', 
     'max_bags' => '1', 
     'min_bags' => '1', 
     'price' => '159.49', 
    )), 
    25 => 
    stdClass::__set_state(array(
     'description' => 'Specialty Convertible', 
     'codes' => 
     array (
     0 => 'XTAR', 
    ), 
     'max_people' => '4', 
     'min_people' => '4', 
     'max_bags' => '2', 
     'min_bags' => '2', 
     'price' => '307.64', 
    )), 
) 

代碼:

usort($car_types,function($a,$b) { 
    return $a->price == $b->price ? 0 : $a->price > $b->price; 
}); 

usort($car_types, function($a, $b) use ($order) { 
    $a_set = intval(isset($order[$a->description])); 
    $b_set = intval(isset($order[$b->description])); 

    return $a_set === $b_set && $a_set === 1 
    ? $order[$a->description] - $order[$b->description] 
    : $b_set - $a_set; 
}); 
+0

將「排序順序」值添加到對象並使用該值進行排序。 – ryantxr

+0

你需要給這些類型排序,然後你可以排序。或者你必須用這些名稱創建一個預定義數組,然後根據這些名稱對數組進行排序。 –

回答

0

定義訂貨陣列,並用它內部usort

$order = [ 
    'Economy Car' => 1, 
    'Compact Car' => 2, 
    'Mid-Size Car' => 3, 
    'Standard-Size Car' => 4, 
    'Full-Size Car' => 5, 
    'Premium Car' => 6, 
    'Luxury Car' => 7, 
    'Standard-Size Convertible' => 8, 
    'Mid-Size SUV' => 9, 
    'Standard SUV' => 10, 
    'Full-Size SUV' => 11, 
    'Minivan' => 12 
]; 

usort($car_types, function ($a, $b) use ($order) { 
    static $notSetPriority; 

    $aPriority = isset($order[$a->description]) 
     ? $order[$a->description] 
     : $notSetPriority ?? ($notSetPriority = count($order) + 1); 
    $bPriority = isset($order[$b->description]) 
     ? $order[$b->description] 
     : $notSetPriority; 

    if (($comparison = $aPriority - $bPriority) === 0) { 
     return floatval($a->price) - floatval($b->price); 
    } 

    return $comparison; 
}); 

如果用於描述順序重量不設置,那麼我們給它一個最w的權重八加一。

不止一次應用usort,因爲這樣很難預測結果。我已將兩個排序標準合併爲一個。

+0

非常感謝!太棒了。有一件事:對於沒有按照訂單定義的剩餘車輛(例如中型特種車輛)...我如何按價格對剩餘車輛進行分類?因此,例如在麪包車應該來中型特種車輛,緊湊型SUV,標準尺寸皮卡,特種車輛等... –

+0

@MichaelAlterio,首先按價格對數組進行排序(應用您在問題中指定的'usort' ),然後按描述進行排序(答案中的'usort')。這應該做的伎倆。 – sevavietl

+0

我已更新原始帖子,按價格排序(從最低到最高)輸入數組。當我按價格進行分配,然後使用上面的訂單餘額時,它不會按訂單之後的最低價格排序。有什麼想法發生了什麼? –

相關問題