我想按“点击”对数组进行排序,但我也想查找特定的 ID 并将其设置为第一次迭代,然后继续“点击”排序。
例如,我有一个多维数组:
$myarray = [
["id" => 10, "hits" => 80],
["id" => 14, "hits" => 50],
["id" => 15, "hits" => 700],
["id" => 18, "hits" => 200],
];
我想测试id是否是特定的,即如果id==18则将其放在第一位,然后按点击率排序。我该如何使用 usort 和自定义函数来做到这一点?
我想我正在寻找类似的东西:
function customsort($a,$b) {
if ($a["id"] == 18) { //or b == 18?
return -1;
} else {
return $a["hits"] > $b["hits"];
}
}
usort($myarray, "customsort");
我想要的结果是订单是:
[
["id" => 18, "hits" => 200],
["id" => 14, "hits" => 50],
["id" => 10, "hits" => 80],
["id" => 15, "hits" => 700],
]
代码中唯一可能导致此功能不起作用的是
return $a["hits"]>$b["hits"];
。您的函数应该仅返回 1/-1(不是 true/false),因此将该行更改为:return $a["hits"]>$b["hits"]?1:-1;
,它应该按预期工作。
PHP 的排序函数都期望“三向比较”。由于“宇宙飞船运算符”输入了该语言,因此几乎没有理由手动进行大于和小于比较。
对于具有两个排序标准的场景,请在回调的每次迭代中比较两个值。在第一次检查中,
id
值是否不是18
——因为false
“小于”true
。这样,任何带有 18
的行都会排在第一位,然后所有其余的行将按辅助规则排序。
使用 spaceship 运算符排序时,对于升序排序,请使用
$a <=> $b
比较。对于降序,请使用 $b <=> $a
比较。每个规则可以使用升序或降序规则。
另请参阅:
代码:(演示)
usort(
$array,
fn($a, $b) => [$a['id'] !== 18, $a['hits']]
<=>
[$b['id'] !== 18, $b['hits']]
);
var_export($array);