У меня есть массив в этом формате:
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); ?>