Сортировка массива по нескольким полям

В моем бэкэнде у меня есть несколько команд для обработки кода для группового турнира, и в конце команды возвращаются в массиве и содержат результаты матчей / статистику и т. Д.

У меня есть следующий массив, который я хочу отсортировать по двум полям в следующем порядке: points (По убыванию), round_difference (По убыванию).

Окончательный и правильный порядок будет: TeamOne, TeamThree, TeamTwo,

Как мне поступить с массивом в этом формате? Это вообще возможно? Я смотрел в array_multisort() однако мои ключи массива / структура в целом немного «странный» по сравнению с другими примерами кода, которые я нашел здесь на странице, и это меня очень смутило.

Надеюсь, кто-то может помочь мне в этом.

Array
(
[1] => Array
(
[1] => Array
(
[id] => 1
[group] => 1
[name] => TeamOne
[tag] => One
[matches] => Array
(
[played] => 1
[won] => 0
[ot_won] => 1
[ot_lost] => 0
[lost] => 0
[round_difference] => 3
[points] => 2
)

)

[238] => Array
(
[id] => 238
[group] => 1
[name] => TeamTwo
[tag] => Two
[matches] => Array
(
[played] => 0
[won] => 0
[ot_won] => 0
[ot_lost] => 0
[lost] => 0
[round_difference] => 0
[points] => 0
)

)

[14] => Array
(
[id] => 14
[group] => 1
[name] => TeamThree
[tag] => Three
[matches] => Array
(
[played] => 1
[won] => 0
[ot_won] => 0
[ot_lost] => 1
[lost] => 0
[round_difference] => -3
[points] => 1
)
)
)

-1

Решение

Пытаться uasort() вместо этого и сравните ключи следующим образом:

uasort($arr[1],function($a,$b){
# If the points are more/less right off the bat, return results
if($a['matches']['points'] < $b['matches']['points'])
return true;
# If they are the same
elseif($a['matches']['points'] == $b['matches']['points'])
# Compare round_difference sort by that
return ($a['matches']['round_difference'] < $b['matches']['round_difference']);
});

Итак, сортировка примерно так:

$arr    =   array(
1 => array(
1 => array(
'id' => 1,
'group' => 1,
'name' => 'TeamOne',
'tag' => 'One',
'matches' => array(
'played' => 1,
'won' => 0,
'ot_won' => 1,
'ot_lost' => 0,
'lost' => 0,
'round_difference' => 3,
'points' => 2
)

),
238 => array
(
'id' => 238,
'group' => 1,
'name' => 'TeamTwo',
'tag' => 'Two',
'matches' => array(
'played' => 0,
'won' => 0,
'ot_won' => 0,
'ot_lost' => 0,
'lost' => 0,
'round_difference' => 0,
'points' => 0,
)

),
14 => array
(
'id' => 14,
'group' => 1,
'name' => 'TeamThree',
'tag' => 'Three',
'matches' => array
(
'played' => 1,
'won' => 0,
'ot_won' => 0,
'ot_lost' => 1,
'lost' => 0,
'round_difference' => '-3',
'points' => 1,
)

),
17 => array
(
'id' => 17,
'group' => 1,
'name' => 'TeamFive',
'tag' => 'Five',
'matches' => array
(
'played' => 1,
'won' => 0,
'ot_won' => 0,
'ot_lost' => 1,
'lost' => 0,
'round_difference' => '-3',
'points' => 2,
)

)
)
);

Дает тебе:

Array
(
[1] => Array
(
[1] => Array
(
[id] => 1
[group] => 1
[name] => TeamOne
[tag] => One
[matches] => Array
(
[played] => 1
[won] => 0
[ot_won] => 1
[ot_lost] => 0
[lost] => 0
[round_difference] => 3
[points] => 2
)

)

[17] => Array
(
[id] => 17
[group] => 1
[name] => TeamFive
[tag] => Five
[matches] => Array
(
[played] => 1
[won] => 0
[ot_won] => 0
[ot_lost] => 1
[lost] => 0
[round_difference] => -3
[points] => 2
)

)

[14] => Array
(
[id] => 14
[group] => 1
[name] => TeamThree
[tag] => Three
[matches] => Array
(
[played] => 1
[won] => 0
[ot_won] => 0
[ot_lost] => 1
[lost] => 0
[round_difference] => -3
[points] => 1
)

)

[238] => Array
(
[id] => 238
[group] => 1
[name] => TeamTwo
[tag] => Two
[matches] => Array
(
[played] => 0
[won] => 0
[ot_won] => 0
[ot_lost] => 0
[lost] => 0
[round_difference] => 0
[points] => 0
)

)

)

)
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector