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?
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\");
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));
}
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\');
This might help: Sorting Arrays of Arrays
function querySort ($first_Array,$second_Array) {
return strcasecmp($first_Array[\'name\'],$second_Array[\'name\']);
}
echo \'<pre>\';
usort($main, \'querySort\');
print_r($main);
die;
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