2016-06-15 82 views
0

給定一個多維數組是這樣的:排序PHP multidimesional陣列:1升,1個定製

$data = array (
[0] => array('aDate' => '2016-01-10', 'tType' => 'Added'), 
[1] => array('aDate' => '2016-01-30', 'tType' => 'RtrnCap'), 
[2] => array('aDate' => '2016-01-20', 'tType' => 'Removed'), 
[3] => array('aDate' => '2016-01-20', 'tType' => 'RtrnCap') 
); 

我怎麼排序這個數組得到這個:

$data = array (
[0] => array('aDate' => '2016-01-10', 'tType' => 'Added'), 
[1] => array('aDate' => '2016-01-20', 'tType' => 'RtrnCap'), 
[2] => array('aDate' => '2016-01-20', 'tType' => 'Removed'), 
[3] => array('aDate' => '2016-01-30', 'tType' => 'RtrnCap') 
); 

凡排序是第一個aDate按升序排列,第二個排序是tType自定義按以下順序排序:已添加,RtrnCap,已刪除。

我已經使用multisort like this SO question爲「多個鍵」和usort(使用匿名函數)(如this SO question)自定義排序一個鍵來搜索解決方案。這些只是解決方案的一半。兩個排序示例使用正常的升序或降序排序順序(我需要一個是自定義順序)。自定義的usort示例工作正常,但它只有一組值。底線:我需要兩種排序:第一種是日期升序,第二種是自定義。

+0

@deceze我回顧了您創建的資源。這是全面的,但我沒有看到它在這兩種組合,我試圖把它們放在一起。原諒我的新主題,但我需要幫助把兩種不同的種類放在一起。 – globalSchmidt

+0

一次按兩個標準排序在**按多個字段排序**部分中進行排序,按照預先定義的順序進行排序在**排序爲手動靜態排序**中進行了介紹。你只需要結合這兩種技術。展示您的最佳嘗試以及您在實施時遇到的具體問題。 – deceze

回答

0
$typeSort = function($a, $b) { 
    if ($a['tType'] == $b['tType']) { 
     return 0; 
    } 

    $priority = array('Added' => 0, 'RtrnCap' => 1, 'Removed' => 2); 
    return ($priority[$a['tType']] < $priority[$b['tType']]) ? -1 : 1; 
}; 

usort($data, function ($a, $b) use ($typeSort) { 
    if ($a['aDate'] == $b['aDate']) { 
     return $typeSort($a, $b); 
    } 

    return ($a['aDate'] < $b['aDate']) ? -1 : 1; 
}); 
+0

謝謝。你能添加一些解釋嗎?看起來像即使正常的升序日期排序現在是一個用戶定義的排序?你也可以將它擴展到第三類,自定義或正常。 – globalSchmidt

+0

如果我們按2列或更多列進行排序,則只能使用用戶定義的排序。首先我們按主列(aDate)排序 - 它是一個普通的排序函數,但如果兩個值相等,我們必須更深入並按第二列(tType)排序。如果你想添加第三列,只需在'$ typeSort'函數中用另一列排序函數替換字符串'return 0;'。 –

+0

完美。我對位置數組的處理做了兩個小調整。由於這是一個外部來源的字符串數組,我設置'$ priority'如下:'$ custom_order_array = array('Added','RtrnCap','Removed',...); $ priority = array_flip($ custom_order_array);'然後我將這兩個語句移到了typeSort函數之外,並設置了'$ typeSort = function($ a,$ b)use($ priority);'就像一個魅力一樣。 – globalSchmidt