63

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?

2
  • 8
    This is not an associative array ... but an array of associative arrays ;-) Commented Jul 10, 2012 at 10:56
  • 1
    Yep, an indexed array of associative arrays Commented Aug 4, 2018 at 14:52

5 Answers 5

111

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");
Sign up to request clarification or add additional context in comments.

3 Comments

And also reading stackoverflow.com/questions/8456029/… also recomended
Substitute return strcmp($a['key'],$b['key']); to compare strings
usort() doesn't maintain the key association, use uasort() to maintain the key association.
18

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

Comments

8

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

2 Comments

While that will work, a comparison function should really return 0 if two elements being compared are equal.
You're right Paul - but as the sort-order is undefined in case of equality, a better solution would be to introduce another comparison to remove this uncertainty. Edited the answer accordingly.
2
function querySort ($first_Array,$second_Array) {
    return strcasecmp($first_Array['name'],$second_Array['name']);
}
echo '<pre>';
usort($main, 'querySort');

print_r($main);
die;

1 Comment

A few words of explanation would make this code example even better.
1

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.