【问题标题】:PHP Sort multi Array by valuePHP 按值对多个数组进行排序
【发布时间】:2015-05-12 18:52:05
【问题描述】:

我想知道如何在 PHP 中以“leaguePoints”为基础进行排序,然后在“wins”中进行排序

<?php
            foreach ($league as $leaguesList)
            {
                if ($leaguesList->queue == "RANKED_SOLO_5x5")
                {
                    foreach ($leaguesList as $list)
                    {
                       if ($list->division == $leagueSummoner->division){
                           $array[] = $list;
                       }
                    }
                }
            }

    var_dump($array);

结果: http://pastebin.com/QkKU7W0k

我正在尝试从 Java 移植它,我是这样做的:

    public void setRankList(List<LeagueSummonerLeagueStats> _rankList) {

    rankList = _rankList;
    Collections.sort(rankList, new Comparator() {

        public int compare(Object match1Obj, Object match2Obj) {

            LeagueSummonerLeagueStats league1 = (LeagueSummonerLeagueStats) match1Obj;

            LeagueSummonerLeagueStats league2 = (LeagueSummonerLeagueStats) match2Obj;

            int i = Integer.compare(league2.getLeaguePoints(), league1.getLeaguePoints());

            if (i != 0)
                return i;

            i = Integer.compare(league2.getWins(), league1.getWins());

            if (i != 0)
                return i;

            return -1;
        }
    });
    }

非常感谢您的宝贵时间,非常感谢您的帮助。

【问题讨论】:

  • 您需要在 PHP 中做的,正是您在 Java 中看到的:您必须定义一个排序比较函数。 (请参阅 PHP 的文档。)此函数将返回一个小于、等于或大于零的值,具体取决于排序引擎提供给它的两个变量之间的顺序。 “我不是写代码的服务”,但实现应该清晰。
  • P.S.我想知道该 Java 例程中是否存在 bug ......我从来没有看到它如何返回 zero!

标签: php arrays sorting object


【解决方案1】:

我通常不喜欢提供解决方案,但您只需将其移植到另一种语言即可。

基本上,您想编写一个冒泡排序回调,它将首先比较两条记录的获胜属性,然后如果它们相等,则回退到联赛积分属性。类似的东西

$data = [
    [
        'wins' => 10,
        'leaguePoints' => 10,
    ],
    [
        'wins' => 10,
        'leaguePoints' => 20,
    ],
    [
        'wins' => 20,
        'leaguePoints' => 10,
    ],    
    [
        'wins' => 10,
        'leaguePoints' => 10,
    ],
];

usort($data, function($a, $b)
{
    if ($a['wins'] === $b['wins']) {
        if ($a['leaguePoints'] === $b['leaguePoints']) {
            return 0;
        }

        return ($a['leaguePoints'] > $b['leaguePoints']) ? -1 : 1;
    }

    return ($a['wins'] > $b['wins']) ? -1 : 1;
});

print_r($data);

【讨论】:

    【解决方案2】:

    你会想像这样使用usort()

    function myCompare($a, $b) {
        // comparison code here
    }
    
    usort($mydata, 'myCompare');
    

    或使用匿名函数:

    usort($mydata, function($a, $b){ /* ... */ });
    

    或者您可以输入任何接受两个参数并返回负数、零或正数的Callable

    【讨论】:

      【解决方案3】:

      不确定我的索引是否正确。

      foreach($league as $leaguesList){
      
        foreach ($leaguesList as $key => $list){
      
          $leaguePoints = [$key] ["info"]["leaguePoints"];
          $wins = [$key] ["info"]["info"]["wins"];
          $sort = $leaguePoints *= 100 + $wins;
          $sorted[$sort] = $list;
      
        }
      }
      ksort($sorted);
      

      【讨论】:

        猜你喜欢
        • 2015-02-19
        • 1970-01-01
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-14
        相关资源
        最近更新 更多