PHP:使用usort()时数组项如何传递给值compare函数?

我正在尝试理解当使用usort()时,我的数组中的项如何传递给我的值比较函数.每次迭代的$x和$y值的打印输出如下:

迭代1:

// $x
array(2) { ["k1"]=> int(21) ["k2"]=> string(1) "e" }

// $y
array(2) { ["k1"]=> int(920) ["k2"]=> string(1) "z" }

迭代2:

// $x
array(2) { ["k1"]=> int(842) ["k2"]=> string(1) "t" }

// $y
array(2) { ["k1"]=> int(21) ["k2"]=> string(1) "e" } 

迭代3:

// $x
array(2) { ["k1"]=> int(920) ["k2"]=> string(1) "z" } 

// $y
array(2) { ["k1"]=> int(21) ["k2"]=> string(1) "e" } 

迭代4:

// $x
array(2) { ["k1"]=> int(842) ["k2"]=> string(1) "t" } 

// $y
array(2) { ["k1"]=> int(920) ["k2"]=> string(1) "z" } 

我的数据:

$data = array(
    array( 'k1' => 920, 'k2' => 'z' ),
    array( 'k1' => 21, 'k2' => 'e' ),
    array( 'k1' => 842, 'k2' => 't' )
);

我的自定义功能:

function value_compare_func( $x, $y ) {
    if ( $x['k1'] > $y['k1'] ) {
        return true;
    } elseif ( $x['k1'] < $y['k1'] ) {
        return false;
    } else {
        return 0;
    }
}

对数组排序:

usort( $data, 'value_compare_function' );

对于第一次迭代,$x [‘k1’]是$data [1] [‘k1’]而$y [‘k1’]是$data [0] [k1].为什么$data数组中的项不按顺序传递给value_compare_func()?例如,我希望第一次迭代的$x [‘k1’]为$data [0] [‘k1’]和$y [‘k1’]为$data [1] [‘k1’] ,但事实并非如此.

最佳答案 这些项如何传递给比较函数的答案需要理解
quicksort algorithm.它的要点是数组中的某些元素被指定为一个枢轴(它可能完全是任何元素,但在高效实现中它通常是中间元素)然后在数据透视的任一侧进行比较以对数组进行排序.

这基本上是PHP中的usort的底层实现.

因此,试图观察元素传递给比较函数的顺序是相对无用的.订单完全不重要.重要的是,您可以放心,它们将始终根据您的回调函数返回的内容进行正确排序.

这里需要注意的重要一点是,手册明确警告不要回写非回归的值,因为非常特殊的原因(它们将被转换为整数),在你的例子中,你从回调中返回一个布尔值false当转换为整数时将变为0.由于0表示两个值相等,因此您不会也不应该期望在此处使用正确排序的数组.

当$a>时,请务必确保返回1的整数值.当$a

点赞