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

时间:2015-11-21 23:34:28

标签: php arrays sorting

我正在尝试了解在使用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'],但事实并非如此。

2 个答案:

答案 0 :(得分:2)

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

这是PHP中基本的usort的基础实现。

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

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

始终确保在1时返回整数值$a > $b,整数值为-1$a < $b时整数值为{{} 1}}来自回调的0

答案 1 :(得分:0)

比较函数应返回一个数值。由于您返回布尔值,因此比较变得不可预测为false == 0,因此两者之间的区别在排序中丢失。

您应该按如下方式更改您的代码:

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

......结果会更合乎逻辑。