按列对二维数组进行排序并遵循动态方向变量

问题描述 投票:0回答:4

我有一个数组,我想按键

[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);
}

请问有什么想法可以解决这个问题吗?

php arrays sorting multidimensional-array dynamic
4个回答
2
投票

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

而不是

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

尝试一下

uasort($res, $f);


1
投票

好吧...我敢打赌没人会想到西班牙宗教裁判所有一个内置的解决方案,速度大约快 25 倍。请忘记用

u*sort
对二维数组进行排序,仅仅阅读手册毫无价值!

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

对于给定的情况,它只是:

array_multisort(array_column($res, 'min'), SORT_DESC, SORT_NUMERIC, $res);

更重要的是,它可以一次按几列排序,就像

ORDER BY
一样,例如:

// ORDER BY `name` ASC, `price` DESC:
array_multisort(
    array_column($rows, 'name'), SORT_ASC,
    array_column($rows, 'price'), SORT_DESC, SORT_NUMERIC,
    $rows
);

您应该注意两件事:

array_column
会跳过没有请求键的行,但这对于从
SELECT
或类似内容获取的数据来说不是问题(请注意,
null
值不会被省略)和
array_multisort
不保留数字键。然而,这两件事都可以轻松解决,无需任何重大开销。

好奇的简单基准:https://gist.github.com/offshore/fb836c1204da85fe2f34557d970350f9


0
投票

为什么

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

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

您正在对每个子数组进行排序 - 这些值中没有

min
,因此全部都是 0。在这种情况下,您的函数将返回 0,因此排序不会执行任何操作。


0
投票

uasort 可能会产生大量开销。

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

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

如果你想检查性能,可以使用microtime

© www.soinside.com 2019 - 2024. All rights reserved.