Я пытаюсь отсортировать ассоциативный массив, который имеет несколько значений для каждой записи.

Например

[0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600525242489 )
[1] => stdClass Object ( [type] => node [sid] => 247 [score] => 0.059600525242489 )

Я хочу, чтобы массив был отсортирован по «баллу» (наивысший балл - это первый индекс)

Как мне это сделать?

2
Señor Reginold Francis 16 Июл 2009 в 00:04

4 ответа

Лучший ответ

Используйте функцию usort с этой функцией сравнения:

function cmpByScore($a, $b) {
    if ($a['score'] == $b['score']) {
        return 0;
    }
    return $a['score'] > $b['score'] ? 1 : -1;
}

usort($array, 'cmpByScore');
8
Gumbo 15 Июл 2009 в 20:08

Пример кода вставлен сюда. Проверьте этот 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
1
womp 15 Июл 2009 в 23:59

Это можно сделать с помощью функции 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");
3
TJ L 15 Июл 2009 в 20:08

Если у вас PHP 5.3, вы можете использовать замыкания, чтобы сделать это немного более динамичным и красивым простым способом:

function sortby(&$array, $key)
{
  usort($array, function($a, $b) {
    return ($a[$key] - $b[$key]);
  });
}

Также обратите внимание, что использование минуса в функции сортировки, как было предложено и tj111, и мной, ужасно сломается, если вы также планируете сортировать строки. В этом случае подход Гамбо является безотказным.

5
skrebbel 15 Июл 2009 в 20:16