Sunday, May 1, 2011

Sorting an associative array in PHP

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?

From stackoverflow
  • This might help: Sorting Arrays of Arrays

  • 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');
    
    Paul Dixon : While that will work, a comparison function should really return 0 if two elements being compared are equal.
    Stefan Gehrig : 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.
  • Use usort and supply your own function to do the ordering, e.g.

    function cmp($a, $b)
    {
        if ($a['avgSearchVolume'] == $b['avgSearchVolume']) {
            return 0;
        }
        return ($a['avgSearchVolume'] > $b['avgSearchVolume']) ? -1 : 1;
    }
    
    usort($array, "cmp");
    
  • 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));
    }
    

0 comments:

Post a Comment