php - 使用数组中找到的数值从高到低排序多维数组
问题描述
我目前正在寻找一种有效的方法来根据最高->最低使用对数组/对象进行排序avgTotalPoints
,然后根据字段中的排名放置一个数值rank
。我查看了一些示例,并能够相应地创建一个函数。但是,它现在正在工作。我正在尝试访问avgTotalPoints
下面显示的排序函数,但我无法访问,因为数组是多深度的。有关如何完成此操作的任何指导?
function sortHighestToLowest($arr)
{
if (isset($arr) && !empty($arr)) {
uasort($arr, function ($a, $b) {
return $a['avgTotalPoints'] <=> $b['avgTotalPoints'];
});
return array_reverse($arr);
}
return null;
}
JSON 输入
{
"mlb": {
"james": {
"avgTotalPoints": 80.675,
"avgPointsDifferential": -0.8112500000000002,
"rank": null
},
"mary": {
"avgTotalPoints": 114.9875,
"avgPointsDifferential": 6.262500000000003,
"rank": null
},
"lucas": {
"avgTotalPoints": 66.825,
"avgPointsDifferential": -9.10625,
"rank": null
},
"timothy": {
"avgTotalPoints": 69.2625,
"avgPointsDifferential": -19.14125,
"rank": null
},
"samantha": {
"avgTotalPoints": 91.625,
"avgPointsDifferential": -36.85000000000001,
"rank": null
}
},
"nhl": {
"samantha": {
"avgTotalPoints": 82.20000000000002,
"avgPointsDifferential": 15.005714285714289,
"rank": null
},
"peter": {
"avgTotalPoints": 77.65714285714284,
"avgPointsDifferential": -13.31857142857143,
"rank": null
},
"rick": {
"avgTotalPoints": 91.61428571428571,
"avgPointsDifferential": 11.217142857142859,
"rank": null
},
"bubba": {
"avgTotalPoints": 119.60000000000001,
"avgPointsDifferential": 28.13333333333334,
"rank": null
},
"james": {
"avgTotalPoints": 90.18571428571428,
"avgPointsDifferential": 10.915714285714285,
"rank": null
}
}
}
期望的结果
stdClass Object
(
[mlb] => stdClass Object
(
[mary] => stdClass Object
(
[avgTotalPoints] => 114.9875
[avgPointsDifferential] => 6.2625
[rank] => 1
)
[samantha] => stdClass Object
(
[avgTotalPoints] => 91.625
[avgPointsDifferential] => -36.85
[rank] => 2
)
[james] => stdClass Object
(
[avgTotalPoints] => 80.675
[avgPointsDifferential] => -0.81125
[rank] => 3
)
[timothy] => stdClass Object
(
[avgTotalPoints] => 69.2625
[avgPointsDifferential] => -19.14125
[rank] => 4
)
[lucas] => stdClass Object
(
[avgTotalPoints] => 66.825
[avgPointsDifferential] => -9.10625
[rank] => 5
)
)
[nhl] => stdClass Object
(
[bubba] => stdClass Object
(
[avgTotalPoints] => 119.6
[avgPointsDifferential] => 28.133333333333
[rank] => 1
)
[rick] => stdClass Object
(
[avgTotalPoints] => 91.614285714286
[avgPointsDifferential] => 11.217142857143
[rank] => 2
)
[james] => stdClass Object
(
[avgTotalPoints] => 90.185714285714
[avgPointsDifferential] => 10.915714285714
[rank] => 3
)
[samantha] => stdClass Object
(
[avgTotalPoints] => 82.2
[avgPointsDifferential] => 15.005714285714
[rank] => 4
)
[peter] => stdClass Object
(
[avgTotalPoints] => 77.657142857143
[avgPointsDifferential] => -13.318571428571
[rank] => 5
)
)
)
```
解决方案
由于您的数组包含多个要单独排序的子数组,您可以利用array_map
将排序应用于这些子数组中的每一个。
这样做之后,您可以简单地循环相同的子数组(通过引用),同时增加一个$rank
变量,并将其分配给每个条目。
此外,您不需要使用array_reverse
来反转排序,只需反转<=>
比较的操作数即可。
function sortHighestToLowest(array $arr): array
{
return array_map(static function (array $entries): array {
uasort($entries, static function (array $entry1, array $entry2): int {
return $entry2['avgTotalPoints'] <=> $entry1['avgTotalPoints'];
});
$rank = 0;
foreach ($entries as &$entry) {
$entry['rank'] = ++$rank;
}
return $entries;
}, $arr);
}
推荐阅读
- c# - 如何更改标题的字体颜色?
- python - 无法理解如何使用 unittest 模块在 python 中为工作日编写测试用例
- python - Pandas concat 不是连接,而是附加
- c - 如何制作一个不会被优化的无限空循环?
- stripe-payments - 条纹多币种转账
- c# - 使用通配符匹配查找特定深度级别的目录
- android - 我有一个 alertDialog ,其中有复选框。我想保留用户选中的复选框的值
- java - Sonarlint 提示“重构代码以便使用流管道”
- wpf - 如何访问给定 XAML 网格单元格中的用户控件?
- javascript - Nodejs crypto.getHashes() 返回一个空数组