php位值,解决 PHP 中 usort 在值相同时改变原始位置的问题
从 PHP 4.1.0 后,usort 在比较的值相同时,原始位置可能会改变,文档中是这样说的:
If two members compare as equal, their order in the sorted array is undefined.
也就是说,如果比较的2个值相同,则它们在排序结果中的顺序是随机的。如果你需要保持相同值的原始位置,可以参考本文的方法。
演示数据:
/*
解决 PHP 中 usort 在值相同时改变原始位置的问题
作者:Artlover http://www.CodeBit.cn
*/
$arr = array(
array('a' => 5, 'b' => 3),
array('a' => 5, 'b' => 1),
array('a' => 5, 'b' => 4),
array('a' => 5, 'b' => 2),
);
?>
数组中第一个元素的值是相同的,期望的结果是保持现有的位置不变,即 b 的顺序为 3,1,4,2
用 usort 排序,当比较字段的值相同时,原始顺序可能会改变
/*
解决 PHP 中 usort 在值相同时改变原始位置的问题
作者:Artlover http://www.CodeBit.cn
*/
$callback = create_function('$a,$b', 'return ($a["a"] == $b["a"])?0:(($a["a"] > $b["a"]) ? 1 : -1);');
usort($arr, $callback);
?>
结果:
Array
(
[0] => Array
(
[a] => 5
[b] => 2
)
[1] => Array
(
[a] => 5
[b] => 4
)
[2] => Array
(
[a] => 5
[b] => 1
)
[3] => Array
(
[a] => 5
[b] => 3
)
)
虽然排序字段的值相同,但是 usort 却将整个数组的顺序打乱了。
如果要在比较的值相同时保持原始位置,可以用 array_multisort :
/*
解决 PHP 中 usort 在值相同时改变原始位置的问题
作者:Artlover http://www.CodeBit.cn
*/
// 索引计数器
$i = 0;
// 创建2个空数组,第一个保存要排序的字段,第二个保存原始索引信息
$a = $index = array();
foreach ($arr as $key => $data) {
$a[$key] = $data['a'];
$index[] = $i++;
}
// 第一个数组先排,接着按原始索引排
array_multisort($a, SORT_ASC, $index, SORT_ASC, $arr);
?>
结果:
Array
(
[0] => Array
(
[a] => 5
[b] => 3
)
[1] => Array
(
[a] => 5
[b] => 1
)
[2] => Array
(
[a] => 5
[b] => 4
)
[3] => Array
(
[a] => 5
[b] => 2
)
)
php位值,解决 PHP 中 usort 在值相同时改变原始位置的问题相关推荐
- 解决Git中打开gitk图形界面时中文部分乱码
解决Git中打开gitk图形界面时中文部分乱码 gitri图形日志gitk打开时,看到中文时乱码,不用着急按照下面方法立刻解决! 分析:这大部分是因为编码格式的问题,建议使用utf-8 without ...
- JAVA中使用 com.csvreader.CsvWriter 类时如何解决文件中JSON内容写出时字符串内容的转义问题?
前言: 当我使用 com.csvreader.CsvWriter 对 .csv 后缀格式文件内容进行写入时,发现所有带有 字符串 内容的字段信息都会默认加上转义字符. 文件生成后,输出的结果不是我想要 ...
- js获取用户在input标签中输入的值,然后改变html下各个标签的值或者属性
2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html> <html lang="en"> <head ...
- 两个办法轻松解决VS中”scanf返回值被忽略“问题
出现原因: 在ANSI C中只有scanf(),没有scanf_s(),但是scanf()在读取时不检查边界(忽略检查返回值),所以可能会造成内存泄漏,于是Microsoft公司在VS编译器中提供了s ...
- [解决] HiveServer2中使用jdbc访问hbase时导致ZooKeeper连接持续增加的解决
最近在监控中发现HiveServer2连接到zookeeper里的连接持续上涨,很奇怪,虽然知道HiveServer2支持并发连接,使用ZooKeeper来管理Hive表的读写锁,但我们的环境并不需要 ...
- ftl转PDF服务器上中文不显示,解决Linux中swftools转换中文pdf时出现乱码问题
前段时间安装了swftools可以将pdf转换为swf文件,然后配合一个FlexPaper,就可以做成和百度图文库类似的东东了. 但是今天,我们开发的同事告诉我说pwd转换的这个会有乱码问题,我看了一 ...
- vue watch监听某输入框中是否有值,然后改变某输入框的属性值
即当内容指标有值,费用范围输入框才可以使用. 以下解决方案:
- 解决Silverlight中DataGrid在显示数据时多一空白列
开发工具及插件 VS 2010,VS2010 SP1,Silverlight5 ,Silverlight5 Tools 涉及的 XAML 的代码段 <sdk:DataGrid AutoGener ...
- 解决IDEA中maven创建web项目时新建无jsp选择项
1.我们new 没有创建jsp页面的选项 2.点击左上角的File下的Project Structure 进入Modules点击红色箭头的加号 3.添加Web文件 4.点击红色箭头指定的+号添加你想要 ...
最新文章
- ESXI5.5添加本地磁盘出错的解决
- 中班音乐 机器人教案_幼儿园中班音乐活动教案《机器人》
- 使用MediaCodeC将图片集编码为视频
- 信息学奥赛一本通 1063:最大跨度值 | OpenJudge NOI 1.5 06:整数序列的元素最大跨度值
- Spring框架 AOP面向切面编程(转)
- 心理压力如何测试软件,心理压力测试 缓解压力有什么办法
- WSUS补丁更新相关命令及参数
- Fatal error: Maximum function nesting level of '100' reached, aborting!
- sql服务器内存不足_SQL Server内存性能指标–第2部分–可用字节,总服务器和目标服务器内存
- oracle 上搭建ogg文档,ogg搭建配置实现oracle数据同步到mysql)
- Android真机没有sqlite3数据库的解决办法
- python解析器下载_pak文件解析-pak文件解析工具下载Python版-西西软件下载
- 【MySQL数据库教程天花板】
- 五道口男子计算机职业技术学院,哈哈!双鸭山大学、五道口男子职业技术学校…盘点高校那些“天雷滚滚”的绰号...
- 电源管理模块设计 - 线性电源和开关电源的区别
- 大话西游2人气稳定服务器,大话西游2开服18年的老区还得排队,凌烟阁确实够火...
- redis源码学习-03_动态字符串SDS
- 狄利克雷卷积学习记录
- 阿里云改名并下载文件,乱码问题解决
- numpy基础—numpy的轴