`
80x86
  • 浏览: 106626 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

php usort

阅读更多
这个函数很倒霉,不容易控制

手册上确实是举例说明usort了,但是只是说,callback $cmp_function 返回值小于、等于、大于,表示第一个参数比第二个小、等、大。
可是在实践中,使用float比较、string直接比较,都会导致usort的行为不正常,就是无法正确的排序,
即使是使用float值比较,然后返回1,-1,0,都是不可以的,所以只能先把float转成int来比较
真是不知道如果我的float不是全部round 2的话,我怎么转化成int,只能自己写个冒泡了。。。






??? public static function tksort(&$arr, $strColumnName, $strOrder = 'ASC') {
??????? usort($arr, array(new TKSorter($strColumnName, $strOrder), "compare"));
??? }

/**
?* The class for sorting by some int columns.
?*
?*/
class TKSorter {
??? private $_cname;
??? private $_order = 'ASC';
??? // see http://80x86.cn/article.asp?id=1761
??? private $_multi = 100; // round is (, 2), so we just multiply 100 here
??? public function __construct($strColumnName, $strOrder = 'ASC', $intMulti = 100) {
??????? $this->_cname = $strColumnName;
??????? $this->_order = $strOrder;
??????? $this->_multi = $intMulti;
??? }
??? public function compare($a, $b) {
??????? if (is_numeric($a[$this->_cname]) && is_numeric($b[$this->_cname])) { // both are numbers
??????????? $dblM = (int)($a[$this->_cname] * $this->_multi) - (int)($b[$this->_cname] * $this->_multi);
??????????? if ($this->_order == 'ASC') {
??????????????? return $dblM;
??????????? } else {
??????????????? return 0 - $dblM;
??????????? }
??????? } else {
??????????? // 强行转化!
??????????? $va = (int)(((double)$a[$this->_cname]) * $this->_multi);
??????????? $vb = (int)(((double)$b[$this->_cname]) * $this->_multi);
??????????? $dblM = $va - $vb;
??????????? if ($this->_order == 'ASC') {
??????????????? return $dblM;
??????????? } else {
??????????????? return 0 - $dblM;
??????????? }
??????? }
??? }
}
?
分享到:
评论

相关推荐

    php usort 使用用户自定义的比较函数对二维数组中的值进行排序

    主要介绍了php usort 使用用户自定义的比较函数对二维数组中的值进行排序,需要的朋友可以参考下

    php数组排序usort、uksort与sort函数用法

    主要介绍了php数组排序usort、uksort与sort函数用法,详细介绍了usort、uksort与sort函数在数组排序中的应用,具有不错的参考借鉴价值,需要的朋友可以参考下

    PHP中usort在值相同时改变原始位置问题的解决方法

    从 PHP 4.1.0 后,usort 在比较的值相同时,原始位置可能会改变,文档中是这样说的: If two members compare as equal, their order in the sorted array is undefined. 也就是说,如果比较的2个值相同,则它们在...

    PHP 多维数组排序(usort,uasort)

    数字索引数组: bool usort( array &$array, callback $cmp_function ) usort函数对指定数组(参数1)按指定方式(参数2)进行排序。 当我们想对多维数组进行排序时,多维数组的每个元素又是一数组类型,而两个数组如何...

    php二维数组排序方法(array_multisort usort)

    一维数组排序可以使用asort、ksort等一些方法进程排序,相对来说比较简单。二维数组的排序怎么实现呢?使用array_multisort和usort可以实现

    (已失效,代码仅供学习)php采集58,赶集网,搜房网,安居客(个人房源)

    通过第三方站点实现的再次采集然后入自己的库,还有许多地方不足,主要用来学习. 用到了 1.usort多维数组排序 2.phpcurl模拟post 3.采集必备 simple_html_dom类库

    PHP callback函数使用方法和注意事项

    在PHP中有些诸如 call_user_function() 或 usort() 的函数接受用户自定义的函数作为一个参数。Callback 函数不仅可以是一个简单的函数,它还可以是一个对象的方法,包括静态类的方法。 一个 PHP 函数用函数名字符串...

    php 5.4手册

    此手册是中文的,2012年编辑 ...数组函数 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 将不再接受对象作为参数. 在将这些函数应用于对象时, 请首先将对象转换为数组. ”

    PHP回调函数与匿名函数实例详解

    本文实例讲述了PHP回调函数与匿名函数。分享给大家供大家参考,具体如下: 回调函数和匿名函数 ...PHP中有许多 “需求参数为函数” 的函数,像array_map,usort,call_user_func_array之类,他们执行传入的函数

    php对数组排序代码分享

    php class=’pingjiaF’ frameborder=’0′ src=’https://www.jb51.net’ scrolling=’no’> 对数组排序 usort() 函数使用用户自定义的函数对数组排序。 */ function cmp($a, $b) //用户自定义回调函数 { if...

    php对数组排序的简单实例

    php class=’pingjiaF’ frameborder=’0′ src=’https://www.jb51.net’ scrolling=’no’> 对数组排序 usort() 函数使用用户自定义的函数对数组排序。 */ function cmp($a, $b) //用户自定义回调函数 { if...

    PHP实现的多维数组排序算法分析

    本文实例讲述了PHP实现的多维数组排序算法。...//那么怎么对key1或者key2进行排序呢,这里就需要使用到usort($arr, 'myfunction')函数了,它的作用是对$arr使用我们自定义的方法进行排序,具体使用方法

    php比较多维数组中值的大小排序实现代码

    如果有值重复的情况,就要用到一些排序算法了,不过php有很强大的函数uasort(),使用自定义的比较函数对数组中的值进行排序并保持索引关联,usort()则会重建索引。 复制代码 代码如下: function cmp($a, $b){ if ($...

    php中二维数组排序问题方法详解

    一维数组排序可以使用asort、ksort等一些方法进程排序,相对来说比较简单。二维数组的排序怎么实现呢?使用array_multisort和usort可以实现,下面跟着小编来学习php中二维数组排序问题方法详解

Global site tag (gtag.js) - Google Analytics