У меня есть массив, который выглядит так:
Array ( [team1] => Array ( [points] => 10 [players] => Array ( ... ) ) [team2] => Array ( [points] => 23 [players] => Array ( ... ) ) ... many more teams )
и я хотел бы сортировать команды по количеству очков, которые у каждой команды есть. Я пробовал это:
function sort_by_points($a,$b) { if ($a['points']==$b['points']) return 0; return ($a['points']<$b['points'])?1:-1; } usort($this->wordswithdata, "sortbycount");
Но этот подход отменяет ключи, содержащие имена команд и возвращает:
Array ( [0] => Array ( [points] => 23 [players] => Array ( ... ) ) [1] => Array ( [points] => 10 [players] => Array ( ... ) ) etc... )
Есть ли способ отсортировать массив без перезаписи имен команд в виде ключей массива?
Используйте функцию uasort , которая должна поддерживать целостность ключей => значение.
(обратите внимание: вы можете return $a['points'] - $b['points']
вместо ifs)
Вы можете использовать uasort
:
uasort($array, function($a, $b) { return $a['points'] - $b['points']; });
Эта функция сортирует массив таким образом, что индексы массива сохраняют свою корреляцию с элементами массива, с которыми они связаны, используя пользовательскую функцию сравнения.
Попробуйте этот код, надеюсь, он сработает.
function aasort (&$array, $key) { $sorter=array(); $ret=array(); reset($array); foreach ($array as $ii => $va) { $sorter[$ii]=$va[$key]; } asort($sorter); foreach ($sorter as $ii => $va) { $ret[$ii]=$array[$ii]; } $array=$ret; } aasort($your_array,"points");