php - php中的排序功能
问题描述
为什么以下代码段中的 usort 函数不仅按“num”键的值按降序对矩阵进行排序,而且还按“lett”的值对“num”键的值相等的元素进行排序键按升序排列?如何仅按函数主体中给出的内容对其进行排序?
<?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;
});
推荐阅读
- javascript - 事件发生在时间间隔而不是点击
- django - 清除 Django 缓存
- regex - VBA 正则表达式与其他正则表达式 - 我不明白它为什么这样做?
- python - 为什么两个线程没有同时执行?
- r - R中的简单数据操作任务
- c - 在 GStreamer 中发送 EOS 信号并使用 C 接收它的正确方法
- swiftui - 列表不滚动(在 SwiftUI 中——为了消除其他问题的歧义)
- python - 用于 Lambda 的无服务器框架/Python - 打包本地共享库
- ruby-on-rails - Ruby on Rails where 方法中的哈希条件
- python - 如何在 python 中停止弹出窗口?