4

我有一个看起来与此类似的数组:

Array
(
  [0] => stdClass Object
    (
      [Leasing] => 12939.74
      [Name] => Jeremy
      [Rental] => 0
      [Sales] => 56603.13
      [Total] => 69542.87
    )
  [1] => stdClass Object
    (
      [Leasing] => 0
      [Name] => Shaun
      [Rental] => 0
      [Sales] => 58590
      [Total] => 58590
    )
  [2] => stdClass Object
    (
      [Leasing] => 0
      [Name] => Lindsay
      [Rental] => 0
      [Sales] => 22951.97
      [Total] => 22951.97
    )
  [3] => stdClass Object
    (
      [Leasing] => 0
      [Name] => Sally
      [Rental] => 1200
      [Sales] => 21624.9
      [Total] => 22824.9
    )
  [4] => stdClass Object
    (
      [Leasing] => 0
      [Name] => House
      [Rental] => 0
      [Sales] => 16235.81
      [Total] => 16235.81
    )
  [5] => stdClass Object
    (
      [Leasing] => 5298.85
      [Name] => Bill
      [Rental] => 1200
      [Sales] => 0
      [Total] => 6498.85
    )
)

目前,该数组使用以下方式按总计排序:

usort($data, function ($a, $b) {
    return $b->Total - $a->Total;
});

现在,我需要能够始终将人[Name] => House放在阵列的顶部。我的想法是我可以将其排序Total(因为我仍然需要这种方式),然后将具有 House 值的元素放在数组的开头。我可以取一个特定的 KEY 并将其放在顶部,但 KEY 可能会根据谁的总数最高而改变。我怎样才能始终将命名的人放在House数组的顶部?

4

2 回答 2

14

这应该有效:

usort($data, function ($a, $b) {
    if ($a->Name != "House" && $b->Name == "House") {
        return 1;
    } elseif ($a->Name == "House" && $b->Name != "House") {
        return -1;
    } else {
        return $b->Total - $a->Total;
    }
});

来自PHP:usort - 手册

如果认为第一个参数分别小于、等于或大于第二个参数,则比较函数必须返回小于、等于或大于零的整数。

在这种情况下,return1告诉排序函数House大于任何其他值,并且-1小于House任何其他值。

于 2013-01-18T19:25:27.380 回答
-1

您的要求:

  1. Name列排序——将有值行置于House无值行之前House
  2. TotalDESC 列排序。

从 PHP7 开始,宇宙飞船运算符 ( <=>) 通过评估规则数组(从左到右读取元素)使排序规则的脚本非常干净。

要首先对行进行排序House,请评估每个对象的Name字符串是否与 相同Housefalse评估将被视为0true评估将被视为1$b通过在运算符左侧写入数据,实现降序排序。该House对象将是唯一评估为 的对象true,并且由于它是第一个排序条件,因此它将优先作为对象数组中的第一个对象。

对于不包含 的其他对象,将House评估第二个排序条件。通过在左侧写入$b' 的值并在右侧写入 ' 的值,再次使用降序排序 - 这将具有较高总计的对象放在具有较低总计的对象之前。Total$aTotal

代码:(演示

usort($objects, function($a, $b) {
   return [$b->Name === 'House', $b->Total] <=> [$a->Name === 'House', $a->Total];
});

输出:

array (
  0 => 
  (object) array(
     'Leasing' => 0,
     'Name' => 'House',
     'Rental' => 0,
     'Sales' => 16235.81,
     'Total' => 16235.81,
  ),
  1 => 
  (object) array(
     'Leasing' => 12939.74,
     'Name' => 'Jeremy',
     'Rental' => 0,
     'Sales' => 56603.13,
     'Total' => 69542.87,
  ),
  2 => 
  (object) array(
     'Leasing' => 0,
     'Name' => 'Shaun',
     'Rental' => 0,
     'Sales' => 58590,
     'Total' => 58590,
  ),
  3 => 
  (object) array(
     'Leasing' => 0,
     'Name' => 'Lindsay',
     'Rental' => 0,
     'Sales' => 22951.97,
     'Total' => 22951.97,
  ),
  4 => 
  (object) array(
     'Leasing' => 0,
     'Name' => 'Sally',
     'Rental' => 1200,
     'Sales' => 21624.9,
     'Total' => 22824.9,
  ),
  5 => 
  (object) array(
     'Leasing' => 5298.85,
     'Name' => 'Bill',
     'Rental' => 1200,
     'Sales' => 0,
     'Total' => 6498.85,
  ),
)
于 2020-01-26T23:18:00.390 回答