Сортировка ассоциативного массива в 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 поле? Есть ли встроенная функция для этого?
6 ответов:
использовать
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); ?>
Comments