PHP 中的 usort 函数



为什么以下代码片段中的 usort 函数不仅按"num"键的值降序对矩阵进行排序,而且还按"lett"键的值按升序对具有相等值的元素进行排序?如何仅按函数主体中给出的内容对其进行排序?

<?php
$mtx = [["num"=>1,"lett"=>"f"], 
["num"=>3,"lett"=>"b"], 
["num"=>3,"lett"=>"a"]
];
usort($mtx, function($a,$b) { 
if($a['num']<$b['num']) return 1;
if($a['num']>$b['num']) return -1;
});
var_dump($mtx);
/*
array(3) { [0]=> array(2) { ["num"]=> int(3) ["lett"]=> string(1) "a" } 
[1]=> array(2) { ["num"]=> int(3) ["lett"]=> string(1) "b" } 
[2]=> array(2) { ["num"]=> int(1) ["lett"]=> string(1) "f" } 
} 
*/

对数组进行排序将尝试将每个项目与其他每个项目进行排序,因此您不能强制usort(仅为您提供值(保持项目的原始顺序,即使这些项目相等。

但是,您可以使用uksort,这也可以让您访问密钥(从原始数组(,从而允许您回退到该键:

uksort($mtx, function ($key1, $key2) use ($mtx) {
$a = $mtx[$key1];
$b = $mtx[$key2];
if ($a['num'] < $b['num']) {
return 1;
}
if ($a['num'] > $b['num']) {
return -1;
}
return $key1 - $key2;
});

较短的形式:

uksort($mtx, function ($key1, $key2) use ($mtx) {
return $mtx[$key2]['num'] - $mtx[$key1]['num'] ?: $key1 - $key2;
});

最新更新