2012-07-29 61 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