我正在尝试了解在使用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']
,但事实并非如此。
答案 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;
}
}
......结果会更合乎逻辑。