2016-11-27 14 views
0

オブジェクトのプロパティに基づいてオブジェクトの配列を並べ替える必要があります。基本的にthisのフィクスチャーテーブルを見て、「Liverpool FC」と「Manchester City FC」に注目すると、それらのポイントの量が同じであることが分かります。複数の値に基づいて配列を並べ替える

mine私はポイントに基づいて注文しているだけなので、複数の値に基づいてこれを注文する方法がわかりません。

データは、Keyがチーム名であるクラスのインスタンス内に格納されます(このインスタンスはArray(に格納されます)。

以下は、データを管理したクラスです。オブジェクトを最初のリンクに並べた順序で配列を並べ替えるにはどうすればよいですか?

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++;} 
    } 
    } 

編集:

私のデータはどこにでも今ある:私は私のチェックは私が$aが大きければ、それはチェックすると仮定して、周囲に間違った方法であると仮定してい

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 

$b以上であればtrueを返し、次のチェックに移行しない場合は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

あなたはusortを使用して別の値を比較し、それに応じてそれらをソート関数を書くことができます。線に沿って

何か:

+0

私はサッカーを知らないので、サッカーのプレミアリーグのポジションがどのように計算されているかわかりません! –

+0

いいえ、私はフットボールについてほとんど知っていませんが、私の推測は最初のPts、次にGD、そしてA – Sane

+0

更新されたポストを見る –

2
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; 
}); 

使用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の位置を引数リストまたは式のいずれかに入れ替えます。

関連する問題