从 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 在值相同时改变原始位置的问题相关推荐

  1. 解决Git中打开gitk图形界面时中文部分乱码

    解决Git中打开gitk图形界面时中文部分乱码 gitri图形日志gitk打开时,看到中文时乱码,不用着急按照下面方法立刻解决! 分析:这大部分是因为编码格式的问题,建议使用utf-8 without ...

  2. JAVA中使用 com.csvreader.CsvWriter 类时如何解决文件中JSON内容写出时字符串内容的转义问题?

    前言: 当我使用 com.csvreader.CsvWriter 对 .csv 后缀格式文件内容进行写入时,发现所有带有 字符串 内容的字段信息都会默认加上转义字符. 文件生成后,输出的结果不是我想要 ...

  3. js获取用户在input标签中输入的值,然后改变html下各个标签的值或者属性

    2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html> <html lang="en"> <head ...

  4. 两个办法轻松解决VS中”scanf返回值被忽略“问题

    出现原因: 在ANSI C中只有scanf(),没有scanf_s(),但是scanf()在读取时不检查边界(忽略检查返回值),所以可能会造成内存泄漏,于是Microsoft公司在VS编译器中提供了s ...

  5. [解决] HiveServer2中使用jdbc访问hbase时导致ZooKeeper连接持续增加的解决

    最近在监控中发现HiveServer2连接到zookeeper里的连接持续上涨,很奇怪,虽然知道HiveServer2支持并发连接,使用ZooKeeper来管理Hive表的读写锁,但我们的环境并不需要 ...

  6. ftl转PDF服务器上中文不显示,解决Linux中swftools转换中文pdf时出现乱码问题

    前段时间安装了swftools可以将pdf转换为swf文件,然后配合一个FlexPaper,就可以做成和百度图文库类似的东东了. 但是今天,我们开发的同事告诉我说pwd转换的这个会有乱码问题,我看了一 ...

  7. vue watch监听某输入框中是否有值,然后改变某输入框的属性值

    即当内容指标有值,费用范围输入框才可以使用. 以下解决方案:

  8. 解决Silverlight中DataGrid在显示数据时多一空白列

    开发工具及插件 VS 2010,VS2010 SP1,Silverlight5 ,Silverlight5 Tools 涉及的 XAML 的代码段 <sdk:DataGrid AutoGener ...

  9. 解决IDEA中maven创建web项目时新建无jsp选择项

    1.我们new 没有创建jsp页面的选项 2.点击左上角的File下的Project Structure 进入Modules点击红色箭头的加号 3.添加Web文件 4.点击红色箭头指定的+号添加你想要 ...

最新文章

  1. ESXI5.5添加本地磁盘出错的解决
  2. 中班音乐 机器人教案_幼儿园中班音乐活动教案《机器人》
  3. 使用MediaCodeC将图片集编码为视频
  4. 信息学奥赛一本通 1063:最大跨度值 | OpenJudge NOI 1.5 06:整数序列的元素最大跨度值
  5. Spring框架 AOP面向切面编程(转)
  6. 心理压力如何测试软件,心理压力测试 缓解压力有什么办法
  7. WSUS补丁更新相关命令及参数
  8. Fatal error: Maximum function nesting level of '100' reached, aborting!
  9. sql服务器内存不足_SQL Server内存性能指标–第2部分–可用字节,总服务器和目标服务器内存
  10. oracle 上搭建ogg文档,ogg搭建配置实现oracle数据同步到mysql)
  11. Android真机没有sqlite3数据库的解决办法
  12. python解析器下载_pak文件解析-pak文件解析工具下载Python版-西西软件下载
  13. 【MySQL数据库教程天花板】
  14. 五道口男子计算机职业技术学院,哈哈!双鸭山大学、五道口男子职业技术学校…盘点高校那些“天雷滚滚”的绰号...
  15. 电源管理模块设计 - 线性电源和开关电源的区别
  16. 大话西游2人气稳定服务器,大话西游2开服18年的老区还得排队,凌烟阁确实够火...
  17. redis源码学习-03_动态字符串SDS
  18. 狄利克雷卷积学习记录
  19. 阿里云改名并下载文件,乱码问题解决
  20. numpy基础—numpy的轴

热门文章

  1. sklearn随机森林展示各个特征权重
  2. c-free5.0运行程序错误_web前端之异常/错误监控
  3. 反射parameter field_Java反射有多强?这5大神奇功能,你需要了解!
  4. Codeforces Round #530 (Div. 2)
  5. idea 中新建Servlet
  6. centos7的网络配置
  7. 部署LNMP架构及其应用
  8. MyEclipse配置进行Hibernate逆映射
  9. DOM操作 append prependTo after before
  10. Topcoder 658Div2