Присвоить ранг элементам массива, который уже отсортирован - PullRequest
1 голос
/ 11 марта 2012

У меня есть такой массив:

[1303] => Array
(
    [Name]  => Al****
    [Total] => 479896.025
)
[13047] => Array
(
    [Name]  => An****
    [Total] => 1999.871
)
[13065] => Array
(
    [Name]  => Ao****
    [Total] => 3947.761
)
[13054] => Array
(
    [Name]  => Ba****
    [Total] => 15666.826
)
[13020] => Array
(
    [Name]  => Bb****
    [Total] => 22366.6456
)
[13016] => Array
(
    [Name]  => Be****
    [Total] => 8307.389
)

Массив отсортирован по имени.Мне нужно назначить ранг для каждого элемента массива на основе общего.В приведенном выше примере элемент 1303 должен иметь ранг 1, элемент 13020 должен иметь ранг 2 и т. Д .;массив должен поддерживать свою существующую сортировку.Какой самый простой способ сделать это.Ожидаемый результат:

[1303] => Array
(
    [Name]  => Al****
    [Total] => 479896.025
    [Rank]  => 1
)
[13047] => Array
(
    [Name]  => An****
    [Total] => 1999.871
    [Rank]  => 6
)
[13065] => Array
(
    [Name]  => Ao****
    [Total] => 3947.761
    [Rank]  => 5
)
[13054] => Array
(
    [Name]  => Ba****
    [Total] => 15666.826
    [Rank]  => 3
)
[13020] => Array
(
    [Name]  => Bb****
    [Total] => 22366.6456
    [Rank]  => 2
)
[13016] => Array
(
    [Name]  => Be****
    [Total] => 8307.389
    [Rank]  => 4
)

Ответы [ 3 ]

3 голосов
/ 11 марта 2012

Сортировка массива по общему значению:

function totalSort($a, $b) {
    if ($a['Total'] > $b['Total']) {
        return -1;
    } else if ($a['Total'] < $b['Total']) {
        return 1;
    } else {
        return 0;
    }
}

uasort($array, 'totalSort');

Добавьте элементы Rank:

$i = 1;
foreach ($array as &$element) {
    $element['Rank'] = $i++;
}

Сортировка массива по Имени снова (если требуется):

function nameSort($a, $b) {
    if ($a['Name'] > $b['Name']) {
        return -1;
    } else if ($a['Name'] < $b['Name']) {
        return 1;
    } else {
        return 0;
    }
}

uasort($array, 'nameSort');
1 голос
/ 11 марта 2012

Я думаю, вы должны сделать два шага:

Сортировать массив

Тщательно выбрал одну функцию сортировки , которая наилучшим образом соответствует вашим потребностям. Я думаю, uasort() сделает:

function cmp($a, $b) {
    if( $a['Total'] == $b['Total']){
        return 0;
    }
    return ($a['Total'] < $b['Total']) ? -1 : 1;
}
uasort( $array, 'cmp');

присвоить звание

Вероятно, цикл foreach будет самым простым способом сделать это:

$i = 1;
foreach( $array as &$item){
    $item['Rank'] = $i;
    $i++;
}
1 голос
/ 11 марта 2012

Я бы сделал что-то вроде этого ...

  1. Клонировать массив
  2. Сортировка клона по сумме (мсорт?)
  3. Перебрать оригинал
  4. Поиск в отсортированном массиве по оригинальному имени (в цикле)
  5. Получить индекс поиска и установить в качестве рейтинга в оригинале
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...