Php 按子数组值对数组排序

Php 按子数组值对数组排序,php,arrays,sorting,Php,Arrays,Sorting,我想在PHP5.4中按子数组的值对数组条目进行排序,但我不确定如何排序 假设我想按数值$result['champions']['stats']['totalSessionPlayed']对数组进行排序 我在谷歌上搜索了一下,没有找到任何有针对性的东西,不过我可能是在搜索错误的东西 任何帮助都将不胜感激,提前谢谢 示例阵列: { "modifyDate": 1393185310000, "champions": [ { "id": 75, "stats": {

我想在PHP5.4中按子数组的值对数组条目进行排序,但我不确定如何排序

假设我想按数值$result['champions']['stats']['totalSessionPlayed']对数组进行排序

我在谷歌上搜索了一下,没有找到任何有针对性的东西,不过我可能是在搜索错误的东西

任何帮助都将不胜感激,提前谢谢

示例阵列:

 {
 "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
数组中没有一个有意义的键来维护关联。