Sorting an associative array in PHP [duplicate]

2019-01-01 02:10发布

问题:

This question already has an answer here:

  • How can I sort arrays and data in PHP? 9 answers

I have an array in this format:

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
        )

)

How can I sort an array in that format, in the descending order of the avgSearchVolume field? Is there a built in function for this?

回答1:

Use usort and supply your own function to do the ordering, e.g.

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

usort($array, \"cmp\");


回答2:

Until PHP 5.3 this is the best function for sorting based on subkeys without making a new function for each key.

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

With PHP 5.3 you can make something like this, same function call as now.

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


回答3:

You\'ll have to use a custom callback function together with usort().

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


回答4:

This might help: Sorting Arrays of Arrays



回答5:

function querySort ($first_Array,$second_Array) {
    return strcasecmp($first_Array[\'name\'],$second_Array[\'name\']);
}
echo \'<pre>\';
usort($main, \'querySort\');

print_r($main);
die;


回答6:

Here is another solution, You can add multiple options for sorting(See the commented section of the code)

<?php

$arr=Array(
     Array(\"text\" => \"tests\",\"language\" =>\"\",\"advertiserCompetitionScale\" => 5,\"avgSearchVolume\" => 7480000,\"lastMonthSearchVolume\" => 9140000),
     Array(\"text\" => \"personality tests\",\"language\" =>\"\",\"advertiserCompetitionScale\" => 5,\"avgSearchVolume\" => 165000,\"lastMonthSearchVolume\"=>201000),
     Array(\"text\" => \"online tests\",\"language\" =>\"\",\"advertiserCompetitionScale\" => 5,\"avgSearchVolume\" => 246000,\"lastMonthSearchVolume\" =>301000)
     );


$sort = array();
foreach($arr as $k=>$v) {
    $sort[\'avgSearchVolume\'][$k] = $v[\'avgSearchVolume\'];
    //$sort[\'text\'][$k] = $v[\'text\'];
}

array_multisort($sort[\'avgSearchVolume\'], SORT_DESC, $arr);
//array_multisort($sort[\'avgSearchVolume\'], SORT_DESC, $sort[\'text\'], SORT_ASC,$arr);

echo \"<pre>\";
print_r($arr);

?>

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