Php 按子数组值对数组排序
我想在PHP5.4中按子数组的值对数组条目进行排序,但我不确定如何排序 假设我想按数值$result['champions']['stats']['totalSessionPlayed']对数组进行排序 我在谷歌上搜索了一下,没有找到任何有针对性的东西,不过我可能是在搜索错误的东西 任何帮助都将不胜感激,提前谢谢 示例阵列:Php 按子数组值对数组排序,php,arrays,sorting,Php,Arrays,Sorting,我想在PHP5.4中按子数组的值对数组条目进行排序,但我不确定如何排序 假设我想按数值$result['champions']['stats']['totalSessionPlayed']对数组进行排序 我在谷歌上搜索了一下,没有找到任何有针对性的东西,不过我可能是在搜索错误的东西 任何帮助都将不胜感激,提前谢谢 示例阵列: { "modifyDate": 1393185310000, "champions": [ { "id": 75, "stats": {
{
"modifyDate": 1393185310000,
"champions": [
{
"id": 75,
"stats": {
"totalDeathsPerSession": 58,
"totalSessionsPlayed": 15,
"totalDamageTaken": 493121,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 2396,
"maxChampionsKilled": 6,
"totalDoubleKills": 4,
"totalPhysicalDamageDealt": 1585013,
"totalChampionKills": 51,
"totalAssists": 100,
"mostChampionKillsPerSession": 6,
"totalDamageDealt": 1930578,
"totalFirstBlood": 0,
"totalSessionsLost": 6,
"totalSessionsWon": 9,
"totalMagicDamageDealt": 325337,
"totalGoldEarned": 156883,
"totalPentaKills": 0,
"totalTurretsKilled": 18,
"mostSpellsCast": 0,
"maxNumDeaths": 7,
"totalUnrealKills": 0
},
"name": "Nasus"
},
{
"id": 5,
"stats": {
"totalDeathsPerSession": 6,
"totalSessionsPlayed": 1,
"totalDamageTaken": 30087,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 145,
"maxChampionsKilled": 4,
"totalDoubleKills": 0,
"totalPhysicalDamageDealt": 58659,
"totalChampionKills": 4,
"totalAssists": 14,
"mostChampionKillsPerSession": 4,
"totalDamageDealt": 93944,
"totalFirstBlood": 0,
"totalSessionsLost": 0,
"totalSessionsWon": 1,
"totalMagicDamageDealt": 35285,
"totalGoldEarned": 11514,
"totalPentaKills": 0,
"totalTurretsKilled": 1,
"mostSpellsCast": 0,
"maxNumDeaths": 6,
"totalUnrealKills": 0
},
"name": "XinZhao"
},
{
"id": 76,
"stats": {
"totalDeathsPerSession": 8,
"totalSessionsPlayed": 2,
"totalDamageTaken": 27123,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 166,
"maxChampionsKilled": 5,
"totalDoubleKills": 1,
"totalPhysicalDamageDealt": 42820,
"totalChampionKills": 10,
"totalAssists": 14,
"mostChampionKillsPerSession": 5,
"totalDamageDealt": 148776,
"totalFirstBlood": 0,
"totalSessionsLost": 0,
"totalSessionsWon": 2,
"totalMagicDamageDealt": 105075,
"totalGoldEarned": 19656,
"totalPentaKills": 0,
"totalTurretsKilled": 3,
"mostSpellsCast": 0,
"maxNumDeaths": 4,
"totalUnrealKills": 0
},
"name": "Nidalee"
},
{
"id": 74,
"stats": {
"totalDeathsPerSession": 8,
"totalSessionsPlayed": 1,
"totalDamageTaken": 25708,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 313,
"maxChampionsKilled": 10,
"totalDoubleKills": 1,
"totalPhysicalDamageDealt": 23397,
"totalChampionKills": 10,
"totalAssists": 10,
"mostChampionKillsPerSession": 10,
"totalDamageDealt": 267380,
"totalFirstBlood": 0,
"totalSessionsLost": 0,
"totalSessionsWon": 1,
"totalMagicDamageDealt": 243833,
"totalGoldEarned": 19122,
"totalPentaKills": 0,
"totalTurretsKilled": 1,
"mostSpellsCast": 0,
"maxNumDeaths": 8,
"totalUnrealKills": 0
},
"name": "Heimerdinger"
},
{
"id": 36,
"stats": {
"totalDeathsPerSession": 22,
"totalSessionsPlayed": 4,
"totalDamageTaken": 85510,
"totalQuadraKills": 1,
"totalTripleKills": 1,
"totalMinionKills": 545,
"maxChampionsKilled": 9,
"totalDoubleKills": 1,
"totalPhysicalDamageDealt": 90623,
"totalChampionKills": 11,
"totalAssists": 28,
"mostChampionKillsPerSession": 9,
"totalDamageDealt": 346793,
"totalFirstBlood": 0,
"totalSessionsLost": 2,
"totalSessionsWon": 2,
"totalMagicDamageDealt": 254140,
"totalGoldEarned": 37894,
"totalPentaKills": 0,
"totalTurretsKilled": 2,
"mostSpellsCast": 0,
"maxNumDeaths": 9,
"totalUnrealKills": 0
},
"name": "DrMundo"
},
{
"id": 115,
"stats": {
"totalDeathsPerSession": 24,
"totalSessionsPlayed": 4,
"totalDamageTaken": 72093,
"totalQuadraKills": 0,
"totalTripleKills": 2,
"totalMinionKills": 684,
"maxChampionsKilled": 40,
"totalDoubleKills": 8,
"totalPhysicalDamageDealt": 70177,
"totalChampionKills": 48,
"totalAssists": 24,
"mostChampionKillsPerSession": 40,
"totalDamageDealt": 724195,
"totalFirstBlood": 0,
"totalSessionsLost": 3,
"totalSessionsWon": 1,
"totalMagicDamageDealt": 650827,
"totalGoldEarned": 51661,
"totalPentaKills": 0,
"totalTurretsKilled": 2,
"mostSpellsCast": 0,
"maxNumDeaths": 8,
"totalUnrealKills": 0
},
"name": "Ziggs"
},
{
"id": 10,
"stats": {
"totalDeathsPerSession": 7,
"totalSessionsPlayed": 1,
"totalDamageTaken": 15911,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 95,
"maxChampionsKilled": 2,
"totalDoubleKills": 0,
"totalPhysicalDamageDealt": 15423,
"totalChampionKills": 2,
"totalAssists": 4,
"mostChampionKillsPerSession": 2,
"totalDamageDealt": 68032,
"totalFirstBlood": 0,
"totalSessionsLost": 1,
"totalSessionsWon": 0,
"totalMagicDamageDealt": 51891,
"totalGoldEarned": 6459,
"totalPentaKills": 0,
"totalTurretsKilled": 0,
"mostSpellsCast": 0,
"maxNumDeaths": 7,
"totalUnrealKills": 0
},
"name": "Kayle"
},
{
"id": 254,
"stats": {
"totalDeathsPerSession": 57,
"totalSessionsPlayed": 8,
"totalDamageTaken": 275656,
"totalQuadraKills": 0,
"totalTripleKills": 1,
"totalMinionKills": 569,
"maxChampionsKilled": 16,
"totalDoubleKills": 8,
"totalPhysicalDamageDealt": 1396894,
"totalChampionKills": 73,
"totalAssists": 79,
"mostChampionKillsPerSession": 16,
"totalDamageDealt": 1608228,
"totalFirstBlood": 0,
"totalSessionsLost": 5,
"totalSessionsWon": 3,
"totalMagicDamageDealt": 26289,
"totalGoldEarned": 114735,
"totalPentaKills": 0,
"totalTurretsKilled": 6,
"mostSpellsCast": 0,
"maxNumDeaths": 11,
"totalUnrealKills": 0
},
"name": "Vi"
},
{
"id": 84,
"stats": {
"totalDeathsPerSession": 12,
"totalSessionsPlayed": 1,
"totalDamageTaken": 40589,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 133,
"maxChampionsKilled": 9,
"totalDoubleKills": 0,
"totalPhysicalDamageDealt": 77620,
"totalChampionKills": 9,
"totalAssists": 6,
"mostChampionKillsPerSession": 9,
"totalDamageDealt": 141249,
"totalFirstBlood": 0,
"totalSessionsLost": 1,
"totalSessionsWon": 0,
"totalMagicDamageDealt": 62145,
"totalGoldEarned": 12596,
"totalPentaKills": 0,
"totalTurretsKilled": 0,
"mostSpellsCast": 0,
"maxNumDeaths": 12,
"totalUnrealKills": 0
},
"name": "Akali"
},
{
"id": 81,
"stats": {
"totalDeathsPerSession": 48,
"totalSessionsPlayed": 11,
"totalDamageTaken": 240602,
"totalQuadraKills": 1,
"totalTripleKills": 1,
"totalMinionKills": 1896,
"maxChampionsKilled": 14,
"totalDoubleKills": 14,
"totalPhysicalDamageDealt": 1570961,
"totalChampionKills": 89,
"totalAssists": 75,
"mostChampionKillsPerSession": 14,
"totalDamageDealt": 1944153,
"totalFirstBlood": 0,
"totalSessionsLost": 6,
"totalSessionsWon": 5,
"totalMagicDamageDealt": 351296,
"totalGoldEarned": 147189,
"totalPentaKills": 0,
"totalTurretsKilled": 17,
"mostSpellsCast": 0,
"maxNumDeaths": 7,
"totalUnrealKills": 0
},
"name": "Ezreal"
},
{
"id": 17,
"stats": {
"totalDeathsPerSession": 4,
"totalSessionsPlayed": 1,
"totalDamageTaken": 15549,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 213,
"maxChampionsKilled": 5,
"totalDoubleKills": 0,
"totalPhysicalDamageDealt": 55465,
"totalChampionKills": 5,
"totalAssists": 2,
"mostChampionKillsPerSession": 5,
"totalDamageDealt": 186354,
"totalFirstBlood": 0,
"totalSessionsLost": 0,
"totalSessionsWon": 1,
"totalMagicDamageDealt": 128342,
"totalGoldEarned": 13553,
"totalPentaKills": 0,
"totalTurretsKilled": 3,
"mostSpellsCast": 0,
"maxNumDeaths": 4,
"totalUnrealKills": 0
},
"name": "Teemo"
},
{
"id": 79,
"stats": {
"totalDeathsPerSession": 12,
"totalSessionsPlayed": 3,
"totalDamageTaken": 48189,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 432,
"maxChampionsKilled": 6,
"totalDoubleKills": 2,
"totalPhysicalDamageDealt": 40141,
"totalChampionKills": 11,
"totalAssists": 20,
"mostChampionKillsPerSession": 6,
"totalDamageDealt": 344112,
"totalFirstBlood": 0,
"totalSessionsLost": 1,
"totalSessionsWon": 2,
"totalMagicDamageDealt": 301544,
"totalGoldEarned": 28523,
"totalPentaKills": 0,
"totalTurretsKilled": 2,
"mostSpellsCast": 0,
"maxNumDeaths": 6,
"totalUnrealKills": 0
},
"name": "Gragas"
},
{
"id": 126,
"stats": {
"totalDeathsPerSession": 5,
"totalSessionsPlayed": 1,
"totalDamageTaken": 22882,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 161,
"maxChampionsKilled": 6,
"totalDoubleKills": 0,
"totalPhysicalDamageDealt": 124060,
"totalChampionKills": 6,
"totalAssists": 7,
"mostChampionKillsPerSession": 6,
"totalDamageDealt": 134709,
"totalFirstBlood": 0,
"totalSessionsLost": 0,
"totalSessionsWon": 1,
"totalMagicDamageDealt": 10648,
"totalGoldEarned": 12014,
"totalPentaKills": 0,
"totalTurretsKilled": 0,
"mostSpellsCast": 0,
"maxNumDeaths": 5,
"totalUnrealKills": 0
},
"name": "Jayce"
},
{
"id": 56,
"stats": {
"totalDeathsPerSession": 13,
"totalSessionsPlayed": 1,
"totalDamageTaken": 45039,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 86,
"maxChampionsKilled": 8,
"totalDoubleKills": 0,
"totalPhysicalDamageDealt": 194352,
"totalChampionKills": 8,
"totalAssists": 4,
"mostChampionKillsPerSession": 8,
"totalDamageDealt": 230377,
"totalFirstBlood": 0,
"totalSessionsLost": 1,
"totalSessionsWon": 0,
"totalMagicDamageDealt": 11050,
"totalGoldEarned": 14589,
"totalPentaKills": 0,
"totalTurretsKilled": 1,
"mostSpellsCast": 0,
"maxNumDeaths": 13,
"totalUnrealKills": 0
},
"name": "Nocturne"
},
{
"id": 35,
"stats": {
"totalDeathsPerSession": 12,
"totalSessionsPlayed": 2,
"totalDamageTaken": 58956,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 173,
"maxChampionsKilled": 10,
"totalDoubleKills": 1,
"totalPhysicalDamageDealt": 274083,
"totalChampionKills": 18,
"totalAssists": 20,
"mostChampionKillsPerSession": 10,
"totalDamageDealt": 447168,
"totalFirstBlood": 0,
"totalSessionsLost": 1,
"totalSessionsWon": 1,
"totalMagicDamageDealt": 125728,
"totalGoldEarned": 30451,
"totalPentaKills": 0,
"totalTurretsKilled": 4,
"mostSpellsCast": 0,
"maxNumDeaths": 6,
"totalUnrealKills": 0
},
"name": "Shaco"
},
{
"id": 60,
"stats": {
"totalDeathsPerSession": 36,
"totalSessionsPlayed": 7,
"totalDamageTaken": 159069,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 290,
"maxChampionsKilled": 14,
"totalDoubleKills": 3,
"totalPhysicalDamageDealt": 339038,
"totalChampionKills": 48,
"totalAssists": 40,
"mostChampionKillsPerSession": 14,
"totalDamageDealt": 982180,
"totalFirstBlood": 0,
"totalSessionsLost": 4,
"totalSessionsWon": 3,
"totalMagicDamageDealt": 555025,
"totalGoldEarned": 74004,
"totalPentaKills": 0,
"totalTurretsKilled": 2,
"mostSpellsCast": 0,
"maxNumDeaths": 8,
"totalUnrealKills": 0
},
"name": "Elise"
},
{
"id": 1,
"stats": {
"totalDeathsPerSession": 12,
"totalSessionsPlayed": 3,
"totalDamageTaken": 35249,
"totalQuadraKills": 0,
"totalTripleKills": 0,
"totalMinionKills": 108,
"maxChampionsKilled": 4,
"totalDoubleKills": 0,
"totalPhysicalDamageDealt": 26391,
"totalChampionKills": 6,
"totalAssists": 26,
"mostChampionKillsPerSession": 4,
"totalDamageDealt": 114034,
"totalFirstBlood": 0,
"totalSessionsLost": 1,
"totalSessionsWon": 2,
"totalMagicDamageDealt": 87641,
"totalGoldEarned": 25827,
"totalPentaKills": 0,
"totalTurretsKilled": 3,
"mostSpellsCast": 0,
"maxNumDeaths": 6,
"totalUnrealKills": 0
},
"name": "Annie"
},
{
"id": 62,
"stats": {
"totalDeathsPerSession": 184,
"totalSessionsPlayed": 35,
"totalDamageTaken": 942852,
"totalQuadraKills": 0,
"totalTripleKills": 5,
"totalMinionKills": 2390,
"maxChampionsKilled": 19,
"totalDoubleKills": 41,
"totalPhysicalDamageDealt": 6088845,
"totalChampionKills": 294,
"totalAssists": 259,
"mostChampionKillsPerSession": 19,
"totalDamageDealt": 7057221,
"totalFirstBlood": 0,
"totalSessionsLost": 13,
"totalSessionsWon": 22,
"totalMagicDamageDealt": 242937,
"totalGoldEarned": 467825,
"totalPentaKills": 0,
"totalTurretsKilled": 27,
"mostSpellsCast": 0,
"maxNumDeaths": 12,
"totalUnrealKills": 0
},
"name": "MonkeyKing"
},
{
"id": 0,
"stats": {
"totalDamageTaken": 3960844,
"totalTripleKills": 17,
"totalMinionKills": 14847,
"maxChampionsKilled": 40,
"maxLargestCriticalStrike": 1304,
"totalChampionKills": 980,
"totalPhysicalDamageDealt": 17450877,
"rankedPremadeGamesPlayed": 0,
"totalSessionsLost": 67,
"totalNeutralMinionsKilled": 9357,
"totalSessionsWon": 77,
"totalMagicDamageDealt": 4544191,
"maxLargestKillingSpree": 28,
"totalPentaKills": 0,
"maxTimeSpentLiving": 1516,
"totalDeathsPerSession": 799,
"totalQuadraKills": 4,
"totalSessionsPlayed": 144,
"totalDoubleKills": 110,
"totalAssists": 1137,
"maxTimePlayed": 3951,
"mostChampionKillsPerSession": 40,
"totalDamageDealt": 23554634,
"botGamesPlayed": 0,
"killingSpree": 454,
"totalFirstBlood": 0,
"rankedSoloGamesPlayed": 0,
"totalHeal": 786891,
"totalGoldEarned": 1783556,
"mostSpellsCast": 0,
"totalTurretsKilled": 126,
"maxNumDeaths": 14,
"totalUnrealKills": 0,
"normalGamesPlayed": 0
},
"name": "Combined"
}
],
"summonerId": value
}
您应该将uasort()与自定义排序函数(回调)一起使用
有关各种数组排序函数的详细信息,请阅读本文档。您的符号表示您有一个对象而不是数组,但假设这只是一个误传,并且您确实有一个数组,
usort()
应该可以做到这一点:
$array = ...; // your starting array
usort($array, function($a, $b) {
if ($a['stats']['stats3'] == $b['stats']['stats3']) {
return 0;
} else if ($a['stats']['stats3'] > $b['stats']['stats3']) {
return 1;
} else {
return -1;
}
});
基于更新的JSON进行更新。假设您在解码JSON时没有强制使用关联数组(如果您没有必要,您确实不应该这样做):代码可能如下所示:
$object = json_decode($your_input_json);
usort($object->champions, function($a, $b) {
return $a->stats->totalSessionsPlayed - $b->stats->totalSessionsPlayed;
});
uasort($array, function($a, $b){
return (int)($a['stats']['totalAssists']) - (int)($b['stats']['totalAssists']);
});
这将对您的$object->champions
数组进行适当排序。尝试使用php的
此代码未经测试,但至少应演示usort(…)
(有关更多信息,请参阅)
函数cmp($a,$b){
$a=$a['stats']['totalSessionsPlayed'];
$b=$b['stats']['totalSessionsPlayed'];
如果($a==$b)返回0;
回报率($a<$b)?-1:1;
}
usort($result['champions'],“cmp”);
您可以使用带有自定义回调的uasort
进行排序。回调比较两个项并返回负值、0或正值,以指示item1是否小于、等于或大于item2
所以你可以这样使用它:
$object = json_decode($your_input_json);
usort($object->champions, function($a, $b) {
return $a->stats->totalSessionsPlayed - $b->stats->totalSessionsPlayed;
});
uasort($array, function($a, $b){
return (int)($a['stats']['totalAssists']) - (int)($b['stats']['totalAssists']);
});
uasort
与usort
非常相似,但它保留了键。有什么问题?为什么数组使用对象表示法?它是JSON格式的,但在使用之前我会对其进行JSON解码($result,true)。所以我想用JSON更容易显示。@kingkero我知道,但我不想把三元运算符或“字符串数学”加入到显然正在学习该语言的人的混合中。这将有望更清楚地演示该功能。加上你没有;我不会因为以牺牲清晰性为代价删除一两行代码而获得额外的分数。我已经更新了我上面处理的json响应。当然,我也可以对它进行解码,只是阅读起来不那么容易SO@User123456789我更新了我的答案,根据您实际的JSON数据给出了更具体的示例。您不需要使用三元运算符来缩短这个过程。compare函数需要返回一个小于、等于或大于0的值,它不必精确地为-1或1。所以你可以返回a-b
,就像我在回答中演示的那样。@GolezTrol同意。在问题被更新之前,她将值显示为字符串进行比较。由于它们是整数值,$a->stats->totalSessionsPlayed-$b->stats->totalSessionsPlayed
的比较更有逻辑意义。我在回答中更新了更具体的解决方案。我在上面更新了我的数组,我尝试了uasort(),但没有任何运气。我不认为这里需要uasort()
,因为数组中没有任何有意义的键被排序,因此需要维护键到值的关联。此函数在数字索引数组上没有意义。您是对的,但在编辑之前,提供的数组是关联的。我认为您不会希望在这里使用uasort()
,因为champions
数组中没有一个有意义的键来维护关联。