加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP – 多个uasort函数会破坏排序

发布时间:2020-12-13 21:40:27 所属栏目:PHP教程 来源:网络整理
导读:我有一个存储人的多维数组. Array ( id93294 = (array ( Name = "Tom Anderson",Birthday = "03/17/1975"),id29349 = (array ( Name = "Tom Anderson",Birthday = "03/17/1975")) 有点像那样,除了有更多的人的信息,所以我想先按生日排序然后按另一个属性排序
我有一个存储人的多维数组.

Array (
   id93294 => (array (
             Name => "Tom Anderson",Birthday => "03/17/1975"),id29349 => (array (
             Name => "Tom Anderson",Birthday => "03/17/1975")
)

有点像那样,除了有更多的人的信息,所以我想先按生日排序然后按另一个属性排序(如果他们的家乡匹配他们的当前位置)但是一旦我在阵列上进行第二次排序它就失去了第一种类型我确实使用过生日……

如何排序多次而不会弄乱我之前的排序.

附:我正在使用uasort.

解决方法

更新

我最近在关于排序多维数组的“权威”主题中以更有能力的方式讨论了这个问题.您可以安全地跳过阅读本答复的其余部分,并直接点击链接以获得更强大的解决方案.

原始答案

函数uasort允许您定义自己的比较函数.只需将您想要的所有标准放入其中即可.

例如,按生日排序,然后按名称排序:

function comparer($first,$second) {
    // First see if birthdays differ
    if ($first['birthday'] < $second['birthday']) {
        return -1;
    }
    else if ($first['birthday'] > $second['birthday']) {
        return 1;
    }

    // OK,birthdays are equal. What else?
    if ($first['name'] < $second['name']) {
        return -1;
    }
    else if ($first['name'] > $second['name']) {
        return 1;
    }

    // No more sort criteria. The two elements are equal.
    return 0;
}

我忽略了这样一个事实:在你的例子中,生日的格式不能通过使用运算符<的简单比较来排序.在实践中,您首先将它们转换为简单的可比较格式. 更新:如果您认为保持一堆这些多标准比较器可能会很快变得难看,那么您会发现我同意.但是这个问题可以像计算机科学中的任何其他问题一样解决:只需添加另一个抽象层次. 我将在下一个示例中假设PHP 5.3,以便使用方便的anon函数语法.但原则上,您可以使用create_function执行相同的操作.

function make_comparer() {
    $criteriaNames = func_get_args();
    $comparer = function($first,$second) use ($criteriaNames) {
        // Do we have anything to compare?
        while(!empty($criteriaNames)) {
            // What will we compare now?
            $criterion = array_shift($criteriaNames);

            // Do the actual comparison
            if ($first[$criterion] < $second[$criterion]) {
                return -1;
            }
            else if ($first[$criterion] > $second[$criterion]) {
                return 1;
            }

        }

        // Nothing more to compare with,so $first == $second
        return 0;
    };

    return $comparer;
}

然后你可以这样做:

uasort($myArray,make_comparer('birthday','name'));

这个例子可能试图太聪明;一般来说,我不喜欢使用不接受名称参数的函数.但在这种情况下,使用场景是一个非常强大的理由,因为它过于聪明.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读