Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于多个值对数组进行排序_Php_Arrays - Fatal编程技术网

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

Php 基于多个值对数组进行排序,php,arrays,Php,Arrays,我需要根据对象属性对对象数组进行排序。基本上,如果你看一看赛程表,注意到“利物浦队”和“曼城队”,你会发现他们的分数是一样的,所以他们是根据其他更高的数值排序的 现在,如果你看一看,我只是基于点排序,我不知道如何基于多个值排序 数据存储在类的实例中,该实例存储在数组()中,其中键是团队名称 下面是管理数据的类,如何重新排列数组,使对象按第一个链接的顺序排列 class Calc { private $config; public $win = 0, $draw = 0, $lo

我需要根据对象属性对对象数组进行排序。基本上,如果你看一看赛程表,注意到“利物浦队”和“曼城队”,你会发现他们的分数是一样的,所以他们是根据其他更高的数值排序的

现在,如果你看一看,我只是基于点排序,我不知道如何基于多个值排序

数据存储在类的实例中,该实例存储在
数组(
)中,其中
键是团队名称

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

 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
是否大于或等于
$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;
});
//按点对团队进行排序
uasort($teamData,function($a,$b){
如果($a->calcPoints()<$b->calcPoints()&&&$a->calcPoints()!==$b->calcPoints()){
返回true;
}elseif($a->calcGoalDifference()<$b->calcGoalDifference()&&&$a->calcGoalDifference()!==$b->calcGoalDifference()){
返回true;
}其他($a->goalConc<$b->goalConc){
返回true;
}
返回false;
});
您可以使用和编写一个函数来比较不同的值并相应地对它们进行排序

大致如下:

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;
});
uasort($teamData,function($a,$b)
{
如果($a->calcPoints()<$b->calcPoints())
{
返回1;
}
elseif($a->calcPoints()calcPoints()&&&$a->calcGoalDifference()<$b->calcGoalDifference())
{
返回1;
}
其他($a->calcPoints()calcPoints()&&&$a->calcGoalDifference()calcGoalDifference())&&$a->goalConc<$b->goalConc)
{
返回1;
}
返回0;
});
您可以使用和编写一个函数来比较不同的值并相应地对它们进行排序

大致如下:

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;
});
uasort($teamData,function($a,$b)
{
如果($a->calcPoints()<$b->calcPoints())
{
返回1;
}
elseif($a->calcPoints()calcPoints()&&&$a->calcGoalDifference()<$b->calcGoalDifference())
{
返回1;
}
其他($a->calcPoints()calcPoints()&&&$a->calcGoalDifference()calcGoalDifference())&&$a->goalConc<$b->goalConc)
{
返回1;
}
返回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的位置。

使用
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的位置。

你知道足球超级联赛的位置是如何计算的,因为我根本不懂足球!不,我对足球知之甚少,但我猜首先是Pts,然后是GD,然后是AI调整以满足你的需要,我想仅供参考:@trincot的帖子比我的帖子更干净。你知道足球超级联赛的位置是如何计算的,因为我根本不懂足球!不,我对足球知之甚少,但我猜首先是Pts,然后是GD,然后是AI调整以满足您的需要,我想仅供参考:@trincot的帖子比我的帖子更干净。