将具有特定值的数组元素移动到数组顶部

时间:2013-01-18 19:10:15

标签: php

我有一个类似于这个的数组:

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的人放在数组的顶部?

2 个答案:

答案 0 :(得分:11)

这应该有效:

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 - Manual

  

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

在这种情况下,返回1告诉排序函数House大于任何其他值,-1 House小于任何其他值。< / p>

答案 1 :(得分:-1)

您的要求:

  1. Name列排序-将House个有价值的行放在非House个有价值的行之前。
  2. Total列DESC排序。

从PHP7开始,太空飞船操作符(<=>)通过评估规则数组(从左到右读取元素),使排序规则的脚本编写非常干净。

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

对于不包含House的其他对象,将评估第二种排序条件。通过在左侧写$b的{​​{1}}值和在右侧写Total的{​​{1}}值,再次使用降序排序-这将对象总数较高的对象之前的总数较高。

代码:(Demo

$a

输出:

Total