В настоящее время я могу сортировать многомерный массив с помощью пользовательского метода сортировки. Каждый массив lineupSet
имеет количество элементов n
. Функция sort_points
будет сортировать каждую lineupSet
от самой высокой до самой низкой totalPoints
, а затем даст мне lineupSet
с наибольшим общим значением totalPoints
. В настоящее время я меняю подход, я все еще хочу отсортировать сначала каждый lineupSet
и упорядочить по возрастанию к наименьшему Тогда я хотел бы получить наибольшее значение totalPoints
каждого lineupSet
на основе данного количества. Каков наилучший способ приблизиться к этому?
Тестовый массив:
$testArray = [[
"lineupSet" => [
[[
"formula" => [
"totalPoints" => 214.61,
],
"name" => "arr0-test0",
], [
"formula" => [
"totalPoints" => 201.17,
],
"name" => "arr0-test1",
]], [
"formula" => [
"totalPoints" => 5.01,
],
"name" => "arr0-test2",
]],
], [
"lineupSet" => [
[[
"formula" => [
"totalPoints" => 214.76,
],
"name" => "arr1-test0",
], [
"formula" => [
"totalPoints" => 220.66,
],
"name" => "arr1-test1",
]],
],
], [
"lineupSet" => [
[[
"formula" => [
"totalPoints" => 205.71,
],
"name" => "arr2-test0",
], [
"formula" => [
"totalPoints" => 204.43,
],
"name" => "arr2-test1",
]],
],
], [
"lineupSet" => [
[[
"formula" => [
"totalPoints" => 205.48,
],
"name" => "arr3-test0",
], [
"formula" => [
"totalPoints" => 203.51,
],
"name" => "arr3-test1",
]],
],
]];
Функция сортировки
function sum_points($v) {
$totalPoints = 0;
foreach ($v['lineupSet'] as $lset) {
if (isset($lset['formula'])) {
$totalPoints += $lset['formula']['totalPoints'];
}
else {
foreach ($lset as $l) {
$totalPoints += $l['formula']['totalPoints'];
}
}
}
return $totalPoints;
}
function sort_points($a, $b) {
return sum_points($b) - sum_points($a);
}
usort($testArray, 'sort_points');
print_r($testArray[0]);
Например, я хочу получить два верхних «максимальных балла». Желаемый результат:
Array (
[lineupSet] => Array
(
[0] => Array
(
[0] => Array
(
[formula] => Array
(
[totalPoints] => 220.66
)
[name] => arr1-test1
)
[1] => Array
(
[formula] => Array
(
[totalPoints] => 214.76
)
[name] => arr0-test0
)
)
)
)
Я хочу сделать то же самое для верха n
наивысшего totalPoints
. Помня о том, что иногда придется брать n
предметов из каждого lineupSet
, которые являются самыми высокими totalPoints
.