【问题标题】:Walking through an array and sorting遍历数组并排序
【发布时间】:2013-07-15 21:12:42
【问题描述】:

好的,这是交易:我正在尝试根据以下标准(按顺序)对团队进行排序:

  1. 总体记录
  2. 分区记录
  3. 头对头结果

对于项目 1、2 和 4,我可以简单地从 SQL 数据库中提取数据。因此,当我遍历 SQL 结果时,我可以创建以下数组:

arr[$row['team_id']] => array('overall_wins'  => $row['wins'],
                              'division_wins' => $row['div_wins'],
                              'points'        => $row['pts']);

到目前为止一切顺利。 问题是两支或多支球队的总胜场和分区胜场相同。在这种情况下,我需要能够利用他们的正面交锋记录来打破平局。

所以我的想法是遍历上面的数组并使用临时变量来检查当前的 overall_winsdivision_wins 是否等于前一个团队的值,然后“做点什么”......使用头对头打破平局。

现在,我可以再次使用 SQL 获得两个团队之间的交锋记录,所以这不是问题,但我的问题是:

我如何利用我的阵列进行显示使用打破两支球队之间的平局?

让我们使用以下示例:

  team_id     overall_wins     division_wins
------------------------------------------
  B           6                6
  A           7                7
  E           6                5
  C           6                6
  G           10               9
  D           4                3
  F           2                0

这首先会被视为:

  team_id     overall_wins     division_wins
------------------------------------------
  G           10               9
  A           7                7
  B           6                6
  C           6                6
  E           6                5
  D           4                3
  F           2                0

...但是假设 C 队正面交锋 B 队。在这种情况下,B 队和 C 队需要按上述顺序交换。

我不确定如何仅在 PHP 数组的范围内执行此操作,而不会完全疯狂地处理整个临时数组之类的东西。

想法?谢谢。

【问题讨论】:

  • 那么,让您确定正面交锋结果的架构是什么?
  • @Jon 我直接在 SQL 中比较了两支球队的正面交锋得分,并从比较中获得输赢数字。
  • 如果你只是usort(),你可以调用任何函数/做任何你喜欢的数据库调用,当你意识到整体和分区胜利是一样的......
  • @praguian:这是一个已经修正的错字,意思是usort() :)(是的,你已经看到了;))
  • SELECT 部分中选择一个头对头获胜字段作为派生/计算字段,然后您可以对其进行排序,例如select team.id, (magic stuff here) AS head_to_head .... ORDER BY overall_wins, division_wins, head_to_head

标签: php arrays sorting


【解决方案1】:

你可以使用 usort

  function compareTeams ($a, $b){
            if ($a["overall_wins"] == $b["overall_wins"]){
                if ($a["division_wins"] == $b["division_wins"]){
                   if ($a["head_to_head"] == $b["head_to_head"]){
                      return 0;
                   } else {
                      return $a["head_to_head"] == $b["head_to_head"];
                   }
                } else {
                   return $a["division_wins"] - $b["division_wins"];
                }
            } else {
                return $a["overall_wins"] - $b["overall_wins"];
            }
  }

  usort($arr, "compareTeams");

$arr 现在将根据您的需要进行排序

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2015-04-28
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多