2013-07-12 137 views
1

我正在寻找做一些复杂的数组排序,但我不知道从哪里开始。内部数组有三个相关的键排序:第一年(数字ASC),然后是月份(数字ASC),最后是名称(按字母顺序排列的DESC)。基于三个内部阵列键值的PHP排序数组

<?php 
// the current array: 
$array = (
    array('year'=>2012, 'month'=>3, 'name'=>'John', 'score'=>12), 
    array('year'=>2013, 'month'=>8, 'name'=>'Paul', 'score'=>3), 
    array('year'=>2013, 'month'=>5, 'name'=>'Dennis', 'score'=>7), 
    array('year'=>2012, 'month'=>3, 'name'=>'Paul', 'score'=>5), 
    array('year'=>2012, 'month'=>12, 'name'=>'Paul', 'score'=>9), 
    array('year'=>2012, 'month'=>9, 'name'=>'Mitt', 'score'=>3) 
); 

// I want to do some sorting with this as output: 
$array = (
    array('year'=>2012, 'month'=>3, 'name'=>'John', 'score'=>12), 
    array('year'=>2012, 'month'=>3, 'name'=>'Paul', 'score'=>5), 
    array('year'=>2012, 'month'=>9, 'name'=>'Mitt', 'score'=>3), 
    array('year'=>2012, 'month'=>12, 'name'=>'Paul', 'score'=>9), 
    array('year'=>2013, 'month'=>5, 'name'=>'Dennis', 'score'=>7), 
    array('year'=>2013, 'month'=>8, 'name'=>'Paul', 'score'=>3) 
); 
?> 

如果有人能指出我真正赞赏的正确方向;-)。

+0

[''usort()'](http://php.net/manual/en/function.usort.php) – alex

回答

3

这应该工作...

<?php 
    // Obtain a list of columns 
    // PHP 5 >= 5.5.0 
    $years = array_column($array, 'year'); 
    $months = array_column($array, 'month'); 
    $names = array_map('strtolower', array_column($array, 'name')); // because it's a string sort. 

    // Sort the data with volume descending, edition ascending 
    // Add $data as the last parameter, to sort by the common key 
    array_multisort($years, SORT_ASC, $months, SORT_ASC, $names, SORT_DESC, $array); 
?> 

来源:http://www.php.net/manual/en/function.array-multisort.php

编辑:为PHP < 5.5

<?php 
    // Obtain a list of columns 
    // PHP < 5.5.0 
    foreach ($array as $key => $row) { 
     $years[$key] = $row['year']; 
     $months[$key] = $row['month']; 
     $names[$key] = strtolower($row['name']); // because it's a string sort. 
    } 
?> 
+0

这工作完美,没有听说过array_multisort。谢谢,几分钟后会答应你的回答(当它被允许时)。 – dirk

+0

也许你应该在$ names数组上使用map函数,如果你不确定总是有第一个字母大写的话。 ($ names_lowercase = array_map('strtolower',$ names);)这只用于array_multisort函数,并且不会更改原始数组() –

+0

您的意思是,如果没有您的建议,例如小写'a'被排序在大写'Z'后面? – dirk

1

看看usort。它接受回调,您可以在其中实现两项的自定义比较。除了usort,还有uasortuksort,它们接受回调,但在这种情况下,您需要usort

+0

现在看看它,猜我可以从这里算出来! – dirk

1

你需要 '在array_multisort' 功能。

它在manual