Мне нужно отсортировать массив объектов на основе свойств объектов. В основном, если вы посмотрите на эту таблицу параметров и отметите "Liverpool FC" и «Манчестер Сити» вы можете видеть, что у них одинаковое количество очков, поэтому они упорядочены на основе других значений, которые выше.

Теперь, если вы посмотрите на мою, я заказываю только на основе баллов , я не уверен, как это сделать на основе нескольких значений.

Данные хранятся в экземпляре класса, этот экземпляр хранится в 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++;}
    }
  }

< Сильный > Edit:

Мои данные теперь везде:

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, если да, то верните истину, если нет, переходите к следующей проверке ?

Код:

// 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;
});
0
Martyn Ball 27 Ноя 2016 в 23:52

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;
});
2
Winter Faulk 27 Ноя 2016 в 21:46

Используйте 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 либо в списке аргументов, либо в выражениях.

2
trincot 27 Ноя 2016 в 21:37