我有一个类似于这个的数组:
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
的人放在数组的顶部?
答案 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;
}
});
如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。
在这种情况下,返回1
告诉排序函数House
大于任何其他值,-1
House
小于任何其他值。< / p>
答案 1 :(得分:-1)
您的要求:
Name
列排序-将House
个有价值的行放在非House
个有价值的行之前。Total
列DESC排序。从PHP7开始,太空飞船操作符(<=>
)通过评估规则数组(从左到右读取元素),使排序规则的脚本编写非常干净。
要首先对House
行进行排序,请评估每个对象的Name
字符串是否与House
相同。 false
个评估将被视为0
,而true
个评估将被视为1
。通过将$b
数据写入运算符的左侧,可以实现降序排序。 House
对象将是唯一被评估为true
的对象,并且由于它是第一个排序条件,因此它将优先级作为对象数组中的第一个对象。
对于不包含House
的其他对象,将评估第二种排序条件。通过在左侧写$b
的{{1}}值和在右侧写Total
的{{1}}值,再次使用降序排序-这将对象总数较高的对象之前的总数较高。
代码:(Demo)
$a
输出:
Total