2012-07-29 86 views
5

我有以下的數組:多次排序以陣列

Array 
(
[0] => Array 
    (
     [note] => test 
     [year] => 2011 
     [type] => football 
    ) 

[1] => Array 
    (
     [note] => test1 
     [year] => 2010 
     [type] => basket 
    ) 

[2] => Array 
    (
     [note] => test2 
     [year] => 2012 
     [type] => football 
    ) 

[3] => Array 
    (
     [note] => test3 
     [year] => 2009 
     [type] => basket 
    ) 

[4] => Array 
    (
     [note] => test4 
     [year] => 2010 
     [type] => football 
    ) 

) 

我想先根據另一個陣列按類型進行排序它:

例如:$sort = array('football','basket');

而且事後年。

我該怎麼做?

謝謝。

所需的輸出應該是:

Array 
(
[2] => Array 
    (
     [note] => test2 
     [year] => 2012 
     [type] => football 
    ) 
[0] => Array 
    (
     [note] => test 
     [year] => 2011 
     [type] => football 
    ) 
[4] => Array 
    (
     [note] => test4 
     [year] => 2010 
     [type] => football 
    ) 

[1] => Array 
    (
     [note] => test1 
     [year] => 2010 
     [type] => basket 
    ) 

[3] => Array 
    (
     [note] => test3 
     [year] => 2009 
     [type] => basket 
    ) 

) 

我不介意我們重置索引值。

謝謝。

回答

2

使用array_multisort。假設你的數組是$arr

foreach($arr as $key=>$row) { 
    $type[$key] = $row['type']; 
    $year[$key] = $row['year']; 
} 
array_multisort($type, SORT_ASC, $year, SORT_ASC, $arr); 

要使用addictional陣列指定類型順序,你可以這樣做:

$sortBy = array('football','basket'); 
foreach($arr as $key=>$row) { 
    $type[$key] = array_search($row['type'],$sortBy); 
    $year[$key] = $row['year']; 
} 
array_multisort($type, SORT_ASC, $year, SORT_ASC, $arr); 

實例鏈接:

http://codepad.org/qhZCpbZE

+0

感謝隊友似乎工作。但是我怎樣才能包含$ sortBy數組呢? – glarkou 2012-07-29 09:16:12

+0

@salamis我編輯了我的答案,以覆蓋這一點。 – lafor 2012-07-29 09:40:58

+0

感謝隊友,它似乎按預期工作。一個快速的問題。爲什麼我們仍然使用'$ type,SORT_ASC'如果我們正在用另一個數組排序呢? – glarkou 2012-07-29 09:49:00

1

使用

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

    foreach(array('football','basket') as $type) { 
     if ($a['type']=$type) return -1; 
     if ($b['type']=$type) return 1; 
    } 

    return 0; 
} 


function byYear($a, $b) 
{ 
    if ($a['year'] == $b['year']) { 
     return 0; 
    } 
    return ($a['year'] < $b['year']) ? -1 : 1; 
} 

usort($array,"byType"); 
usort($array,"byYear"); 
+0

這不是工作夥伴。首先,因爲我不能使用另一個數組按類型排序。其次當執行第二次使用時,所有事情都會再次混合。請檢查:http://codepad.org/PO3CvGsu和所需的結果。如果類型相同,我希望按年進行分類。 – glarkou 2012-07-29 08:54:58

+0

它正在工作。 http://codepad.org/PwYKyyMS – Adi 2012-07-29 08:58:00

+0

@Adnan它不起作用,改變數組,它目前的作品是「運氣」 – Leigh 2012-07-29 09:02:50

4

需要PHP的版本當按原樣運行時支持關閉

您的輔助數組可以在排序本身之外定義。如果你不支持閉包,那麼這可以直接放入排序例程中。

$sortBy = array('football', 'basket'); 

排序例程。

如果類型相同,則按年份排序,否則按$sortBy陣列中的類型排序。

usort($a, function($a, $b) use ($sortBy) { 
    if ($a['type'] == $b['type']) { 
     return ($b['year'] - $a['year']); 
    } 
    $typeOrder = array_flip($sortBy); 
    return $typeOrder[$a['type']] - $typeOrder[$b['type']]; 
}); 
+0

我該如何使用它?我嘗試http://codepad.org/HCodcfgl,但它似乎不工作隊友。謝謝你的幫助。 – glarkou 2012-07-29 09:12:50

+0

@salamis鍵盤是PHP 5.2,它是6歲,不支持關閉。 **你**使用哪種版本的PHP? (您也可以使用[Viper 7的鍵盤](http://codepad.viper-7.com/MpTYaB)) – Leigh 2012-07-29 09:17:05