基于多个值对数组进行排序

时间:2016-11-27 20:52:26

标签: php arrays

我需要根据对象属性对对象数组进行排序。基本上,如果您查看this夹具表并注意“利物浦FC”和“曼彻斯特城FC”,您可以看到它们具有相同数量的点数,因此它们是根据其他值更高的顺序排序的。

现在,如果你看看mine我只根据积分进行排序,我不知道如何根据多个值订购。

数据存储在类的实例中,此实例存储在Array(内,Key是团队名称。

下面是管理数据的类,如何重新排列数组,以便对象按顺序排列第一个链接的顺序?

 class Calc {
    private $config;
    public $win = 0, $draw = 0, $loss = 0, $goalFor = 0, $goalConc = 0;

    public function __construct($payload = array(0,0)) {
      // Load config file
      $this->config = parse_ini_file('config.ini', true);

      // Add wins, losses, draws, goals for and goal conceived
      $this->addData($payload);
    }

    // Linked data updated, ammend values
    public function calcPlays() {
      return 0 + $this->win + $this->draw + $this->loss;
    }
    public function calcPoints() {
      // Add 0 to ensure value is an int
      return $this->win * ($this->config['winPoints']) + ($this->draw * $this->config['drawPoints']) + ($this->loss * $this->config['lossPoints']);
    }
    public function calcGoalDifference() {
      return ($this->goalFor - $this->goalConc);
    }

    public function addData($data) {
      // Append goal data
      $this->goalFor += $data[0];
      $this->goalConc += $data[1];

      // Win, Loss or Draw
      if ($data[0] > $data[1]) { $this->win++;} elseif
      ($data[0] < $data[1]) { $this->loss++;} elseif
      ($data[0] == $data[1]) { $this->draw++;}
    }
  }

修改

我的数据现在无处不在:

1   Burnley FC  13  4   2   7   12  21  -9  14
2   Leicester City FC   13  3   4   6   16  22  -6  13
3   Crystal Palace FC   13  3   2   8   21  26  -5  11
4   Swansea City FC 13  2   3   8   16  26  -10 9
5   Arsenal FC  13  8   4   1   28  13  15  28

我假设我的检查是错误的,我假设它会检查$a是否大于或等于$b,如果是,那么返回true,如果没有继续下一次检查?

代码:

// Sort teams by points
uasort($teamData, function($a, $b) {
  if ($a->calcPoints() < $b->calcPoints() && $a->calcPoints() !== $b->calcPoints()) {
    return true;
  } elseif ($a->calcGoalDifference() < $b->calcGoalDifference() && $a->calcGoalDifference() !== $b->calcGoalDifference()) {
    return true;
  } elseif($a->goalConc < $b->goalConc) {
    return true;
  }
  return false;
});

2 个答案:

答案 0 :(得分:2)

您可以使用usort并编写一个比较不同值的函数并相应地对它们进行排序。

有些事情:

uasort($teamData, function ($a, $b)
{
    if ( $a->calcPoints() < $b->calcPoints() )
    {
        return 1;
    }
    elseif ( $a->calcPoints() <= $b->calcPoints() && $a->calcGoalDifference() < $b->calcGoalDifference() )
    {
        return 1;
    }
    elseif ( ($a->calcPoints() <= $b->calcPoints() && $a->calcGoalDifference() <= $b->calcGoalDifference()) && $a->goalConc < $b->goalConc )
    {
        return 1;
    }

    return 0;
});

答案 1 :(得分:2)

使用usort,如下所示:

uasort($teamData, function($a, $b) {
    $diff = $a->calcPoints() - $b->calcPoints();
    if (!$diff) $diff = $a->calcGoalDifference() - $b->calcGoalDifference();
    if (!$diff) $diff = $a->goalConc - $b->goalConc;
    return $diff;
});

当前一个比较为平局时,if条件为真。另请注意,返回值应该是布尔值,而是带符号的数字。

按升序排序。如果你需要反过来,那么在参数列表或表达式中交换 $ a $ b 的位置。