在PHP中对关联数组进行排序

Cli*_*ote 61 php arrays sorting

我有这种格式的数组:

Array
(
    [0] => Array
        (
            [text] => tests
            [language] => 
            [advertiserCompetitionScale] => 5
            [avgSearchVolume] => 7480000
            [lastMonthSearchVolume] => 9140000
        )

    [1] => Array
        (
            [text] => personality tests
            [language] => 
            [advertiserCompetitionScale] => 5
            [avgSearchVolume] => 165000
            [lastMonthSearchVolume] => 201000
        )

    [2] => Array
        (
            [text] => online tests
            [language] => 
            [advertiserCompetitionScale] => 5
            [avgSearchVolume] => 246000
            [lastMonthSearchVolume] => 301000
        )

)
Run Code Online (Sandbox Code Playgroud)

如何按avgSearchVolume字段的降序排列该格式的数组?这有内置功能吗?

Pau*_*xon 104

使用usort并提供您自己的功能来进行排序,例如

function cmp($a, $b)
{
    return $b['avgSearchVolume'] - $a['avgSearchVolume'];
}

usort($array, "cmp");
Run Code Online (Sandbox Code Playgroud)


OIS*_*OIS 18

在PHP 5.3之前,这是基于子键进行排序的最佳函数,而不为每个键创建新函数.

function sortBySubkey(&$array, $subkey, $sortType = SORT_ASC) {
    foreach ($array as $subarray) {
        $keys[] = $subarray[$subkey];
    }
    array_multisort($keys, $sortType, $array);
}
sortBySubkey($arr, 'avgSearchVolume');
Run Code Online (Sandbox Code Playgroud)

使用PHP 5.3,你可以制作类似这样的函数调用,就像现在一样.

function getSortVariable($sortType = SORT_ASC) {
    switch($sortType) {
        case SORT_ASC:
            return function ($a, $b) use ($subkey) { return strcmp($a[$subkey], $b[$subkey]); };
    }
}

function sortBySubkey(&$array, $subkey, $sortType = SORT_ASC) {
    $sortFunction = getSortVariable($sortType);
    usort($array, $sortFunction($subkey));
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*rig 8

您必须与自定义回调函数一起使用usort().

function cmp($a, $b)
{
    if ($a['avgSearchVolume'] == $b['avgSearchVolume']) {
        return 0;
    }
    return ($a['avgSearchVolume'] > $b['avgSearchVolume']) ? -1 : 1;
}
usort($array, 'cmp');
Run Code Online (Sandbox Code Playgroud)