PHP:按值排序数组

时间:2015-06-12 22:45:55

标签: php

我有一个数组,我想按照desc顺序按键[min] (0.2, 0.86 ...)的值对其进行排序。 这是一个数组:

Array
(
    [0] => Array
        (
            [p1_first_res_avalue] => 0.72413793103448
            [p1_rating_lang_avalue] => 0.2
            [p1_ps_res_avalue] => 0.79310344827586      
            [pid] => 0
            [p1_discipline_e_avalue] => 0.77777777777778
            [p1_rating_lang] => 46
            [p1_first_res] => 59
            [p1_ps_res] => 57
            [p1_discipline_e] => 86
            [min] => 0.2
        )

    [1] => Array
        (
            [p1_discipline_e] => 81
            [p1_first_res] => 55
            [p1_rating_lang] => 38
            [p1_ps_res] => 48
            [p1_discipline_e_avalue] => 1
            [pid] => 1
            [p1_first_res_avalue] => 0.86206896551724
            [p1_rating_lang_avalue] => 1
            [p1_ps_res_avalue] => 1
            [min] => 0.86
        )

   [2] => Array
        (
            [p1_discipline_e] => 81
            [p1_first_res] => 55
            [p1_rating_lang] => 38
            [p1_ps_res] => 48
            [p1_discipline_e_avalue] => 1
            [pid] => 1
            [p1_first_res_avalue] => 0.86206896551724
            [p1_rating_lang_avalue] => 1
            [p1_ps_res_avalue] => 1
            [min] => 0.3
        )
...
)

我已尝试使用uasort功能,但我无法访问数组的[min]值来进行比较。这是我尝试的($res是一个数组,需要排序):

$sortd = 'down';
$f = function($a, $b) use ($sortd) {
        if (($sortd) == 'down') {
            if ($a['min'] == $b['min']) return 0;
            return ($a['min'] > $b['min']) ? -1 : 1;
        }
        else {

        }
    };

foreach ($res as $k => $v) {
    uasort($res[$k], $f);
}

请问,任何想法如何解决问题?

3 个答案:

答案 0 :(得分:2)

您的问题似乎是您尝试将排序函数单独应用于数组的每个元素,而不是整个数组。

而不是

foreach ($res as $k => $v) {
    uasort($res[$k], $f);
}

尝试

uasort($res, $f);

答案 1 :(得分:0)

为什么uasort不起作用?你的比较器就是

$f = function($a1, $a2) { return $a1['min'] < $a2['min'] ? -1 : 1; };
uasort($res, $f);

你正在对每个子数组进行排序 - 这些值中没有min,所以一共都是0.在这种情况下,你的函数返回0,所以排序什么都不做。

答案 2 :(得分:0)

uasort 可能会产生很大的开销。

如果要对数组数组进行排序,可以创建展平版本并使用 asort

$flat = array();
foreach ($arr as $index => $item) {
    $flat[$index] = $item[$k];
}
asort($flat);

如果要检查效果,可以使用 microtime