首先对列中具有特定“粘性”值的二维数组的行进行排序,然后按另一列升序排序

问题描述 投票:0回答:2

我想按“点击”对数组进行排序,但我也想查找特定的 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],
]
php arrays sorting multidimensional-array sticky
2个回答
1
投票

代码中唯一可能导致此功能不起作用的是

return $a["hits"]>$b["hits"];
。您的函数应该仅返回 1/-1(不是 true/false),因此将该行更改为:
return $a["hits"]>$b["hits"]?1:-1;
,它应该按预期工作。

果然有效:http://codepad.org/ItyIa7fB


0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.