我需要根据对象属性对对象数组进行排序。基本上,如果您查看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;
});
答案 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 的位置。