Сортировать массив по нескольким полям (ближе всего к числу)

Как я могу отсортировать массив по двум (одному) разным значениям?

Итак, у меня есть такой массив:

array(
array(
'id' => 10,
'total' => 38,
'entry' => 400
),
array(
'id' => 4,
'total' => 34,
'entry' => 3100
),
array(
'id' => 2,
'total' => 34,
'entry' => 3150
),
array(
'id' => 8,
'total' => 34,
'entry' => 2980
),
);

Массив уже отсортирован по ключу total, но все они имеют одинаковое значение в total, Так что мне нужно отсортировать по тому, кто ближе к 3000 по entry,

редактировать

Массив должен быть сначала отсортирован по total а потом entry, поскольку entry только там, так что я могу определить, кто лучше.

Таким образом, массив должен выглядеть так:

array(
array(
'id' => 10,
'total' => 38,
'entry' => 400
),
array(
'id' => 8,
'total' => 34,
'entry' => 2980
),
array(
'id' => 4,
'total' => 34,
'entry' => 3100
),
array(
'id' => 2,
'total' => 34,
'entry' => 3150
)
);

4

Решение

Попробуй это:

usort($arr, function ($a, $b) {
if ($a['total'] == $b['total']) { // Only compare on entry when the totals are the same.
return abs($a['entry'] - 3000) > abs($b['entry'] - 3000);
}
return $a['total'] < $b['total'];
});

print_r($arr);

Выход:

Array
(
[0] => Array
(
[id] => 2
[total] => 35
[entry] => 3150
)

[1] => Array
(
[id] => 8
[total] => 34
[entry] => 2980
)

[2] => Array
(
[id] => 4
[total] => 34
[entry] => 3100
)

[3] => Array
(
[id] => 6
[total] => 34
[entry] => 3250
)

[4] => Array
(
[id] => 3
[total] => 32
[entry] => 3400
)

)

Вот как это работает: сравнивает totals, но если они одинаковы, сравнивается абсолютное значение разницы между entry и 3000 как entrys.

eval.in demo

2

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

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

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