【发布时间】:2019-04-17 05:20:47
【问题描述】:
我目前能够使用自定义排序方法对多维数组进行排序。每个数组lineupSet 有一个n 数量的项目。函数sort_points 将每个lineupSet 从最高到最低totalPoints 排序,然后它会给我lineupSet 和最高总数totalPoints。我目前正在改变方法,我仍然想先对每个lineupSet 进行排序,然后从高到低排序。然后我想根据给定的计数获得每个lineupSet 中最高的totalPoints。解决这个问题的最佳方法是什么?
测试数组:
$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]);
例如,我想获得前两个最高的“totalPoints”。期望的结果:
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 做同样的事情。请记住,有时必须从每个lineupSet 中提取最高totalPoints 的n 项目。
【问题讨论】:
-
您所做的不仅仅是排序,而是在减少。出于这个原因,我会使用array_reduce。也可以将其视为两个单独的排序操作,内部数组和外部数组。
-
@Ultimater 这是一个很好的观点。我以前没有和
array_reduce合作过。你能告诉我如何应用这些方法吗? -
第二个条目实际上应该是 214.76(
totalPoints从排序最高的lineupSet中的第二个条目开始)? -
@Nick,你是对的。我复制粘贴不正确。
-
我认为你需要在每个数组和每个子数组上循环以获得每个数组的总结果