Сортировка ассоциативного массива в PHP

У меня есть массив в этом формате:

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

Как я могу отсортировать массив в этом формате в порядке avgSearchVolume поля avgSearchVolume ? Есть ли встроенная функция для этого?

Используйте usort и usort свою собственную функцию для выполнения заказа, например

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

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

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

Вам нужно будет использовать пользовательскую функцию обратного вызова вместе с usort() .

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

Это может помочь: Сортировка массивов массивов

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

Вот еще одно решение. Вы можете добавить несколько вариантов сортировки (см. Комментарий в коде)

 <?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