php usort排序在php7.2和5.6版本中结果不一样

问题描述

对数组进行排序,先对a字段正序排序,但0排到最后,再对b字段逆序排序

实现代码


// 对数组进行排序,先对a字段正序排序,但0排到最后,再对b字段逆序排序
$a1 = array(
    array('a' => 1,'b' => 1),
    array('a' => 2,'b' => 1),
    array('a' => 1,'b' => 2),
    array('a' => 0,'b' => 1),
    array('a' => 1,'b' => 3),
    array('a' => 2,'b' => 2),
    array('a' => 0,'b' => 2),
    array('a' => 2,'b' => 3)
);

// 对a排序
function my_sort1($a,$b) {
    if ($a['a'] == 0) {
        return 1;
    }
    if ($b['a'] == 0) {
        return -1;
    }
    if ($a['a'] > $b['a']) {
        return 1;
    }
    return -1;
}

// 对b排序
function my_sort2($a,$b) {
    if ($a['a'] == $b['a']) {
        if ($a['b'] < $b['b']) {
            return 1;
        } elseif ($a['b'] > $b['b']) {
            return -1;
        }
    }
    return 0;
}

usort($a1,"my_sort1");
usort2($a1,"my_sort2");

返回结果

php7.2返回结果正常
Array
(

[0] => Array
    (
        [a] => 1
        [b] => 3
    )

[1] => Array
    (
        [a] => 1
        [b] => 2
    )

[2] => Array
    (
        [a] => 1
        [b] => 1
    )

[3] => Array
    (
        [a] => 2
        [b] => 3
    )

[4] => Array
    (
        [a] => 2
        [b] => 2
    )

[5] => Array
    (
        [a] => 2
        [b] => 1
    )

[6] => Array
    (
        [a] => 0
        [b] => 2
    )

[7] => Array
    (
        [a] => 0
        [b] => 1
    )

)
php5.6返回结果有问题
Array
(

[0] => Array
    (
        [a] => 0
        [b] => 2
    )

[1] => Array
    (
        [a] => 0
        [b] => 1
    )

[2] => Array
    (
        [a] => 2
        [b] => 3
    )

[3] => Array
    (
        [a] => 2
        [b] => 2
    )

[4] => Array
    (
        [a] => 2
        [b] => 1
    )

[5] => Array
    (
        [a] => 1
        [b] => 3
    )

[6] => Array
    (
        [a] => 1
        [b] => 2
    )

[7] => Array
    (
        [a] => 1
        [b] => 1
    )

)

思考

**查阅了相关信息,函数php7并没有修改usort方法
疑问:是否php7版本对php数组进行了修改
如果有大神知道的,还望不吝赐教!**

阅读 2.3k
2 个回答
if ($b['a'] == 0) {
    return -1;
}

你这个if是多余的吧,两个if比较结果会产生冲突,所以在排序中可能产生不稳定的结果 。

我把你代码改了下

<?php

// 对数组进行排序,先对a字段正序排序,但0排到最后,再对b字段逆序排序
$a1 = array(
    array('a' => 1,'b' => 1),
    array('a' => 2,'b' => 1),
    array('a' => 1,'b' => 2),
    array('a' => 0,'b' => 1),
    array('a' => 1,'b' => 3),
    array('a' => 2,'b' => 2),
    array('a' => 0,'b' => 2),
    array('a' => 2,'b' => 3)
);

// 对a排序
$count = 0;
function my_sort1($a,$b) {
    global $count;
    $count++;
    if ($a['a'] == 0) {
        return 1;
    }
    /*if ($b['a'] == 0) {
        return -1;
    }*/
    if ($a['a'] > $b['a']) {
        return 1;
    }
    return -1;
}

// 对b排序
function my_sort2($a,$b) {
    if ($a['a'] == $b['a']) {
        if ($a['b'] < $b['b']) {
            return 1;
        } elseif ($a['b'] > $b['b']) {
            return -1;
        }
    }
    return 0;
}

usort($a1,"my_sort1");
usort($a1,"my_sort2");

echo 'Compare times: '.$count,"\n";
var_export($a1);

php7.2 没注释第二个if的情况下,比较了15次,注释了的情况下比较了14次
php5.6 没注释 19次,注释了 16次

function test($a, $b) {
    echo '当前a:' . implode(',', $a) . PHP_EOL;
    echo '当前b:' . implode(',', $b) . PHP_EOL;
    return 0;
}

用这段代码做测试,可以发现PHP5.6PHP7读入$a、$b的顺序是不同的,猜测是这个问题导致

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题