Я пытаюсь сортировать ассоциативный массив, который имеет несколько значений для каждой записи.
Например
[0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600525242489 ) [1] => stdClass Object ( [type] => node [sid] => 247 [score] => 0.059600525242489 )
Я хочу, чтобы массив отсортировался по «оценке» (самый высокий балл – первый индекс)
Как мне это сделать?
Используйте функцию usort
с этой функцией сравнения:
function cmpByScore($a, $b) { if ($a['score'] == $b['score']) { return 0; } return $a['score'] > $b['score'] ? 1 : -1; } usort($array, 'cmpByScore');
Если у вас есть PHP 5.3, вы можете использовать закрытие, чтобы сделать это немного более динамичным и красивым простым способом:
function sortby(&$array, $key) { usort($array, function($a, $b) { return ($a[$key] - $b[$key]); }); }
Также обратите внимание, что использование минуса в функции сортировки, как предложено как tj111, так и мной, будет ужасно ломаться, если вы также планируете сортировать строки. В этом случае подход Гумбо является отказоустойчивым.
Вы можете сделать это с usort
функции usort
. Вот краткий пример того, как вы могли это сделать.
function sortByScore($a, $b) { return $a['score'] - $b['score']; //if a > b it will return positive, a < b will return negative, a == b returns 0 } usort($array, "sortByScore");
Примерный код, вставленный здесь. Проверьте этот URL: текст ссылки
$data[] = array('volume' => 67, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 1); $data[] = array('volume' => 85, 'edition' => 6); $data[] = array('volume' => 98, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 6); $data[] = array('volume' => 67, 'edition' => 7);
В этом примере мы будем заказывать по объему по убыванию, выпуск по возрастанию.
У нас есть массив строк, но array_multisort () требует массив столбцов, поэтому мы используем приведенный ниже код для получения столбцов, а затем выполните сортировку.
// Obtain a list of columns foreach ($data as $key => $row) { $volume[$key] = $row['volume']; $edition[$key] = $row['edition']; } // Sort the data with volume descending, edition ascending // Add $data as the last parameter, to sort by the common key array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
Теперь набор данных будет отсортирован и будет выглядеть так:
volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7