【发布时间】:2015-11-21 23:34:27
【问题描述】:
我试图了解在使用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'],但事实并非如此。
【问题讨论】:
-
您的比较功能有误。您应该在 $x
-
看这里参考:github.com/php/php-src/blob/…,php使用的函数是这个文件中的zend_hash_sort_ex
-
我看到手册说我的值比较函数应该返回
int值(1、-1和0)但使用false代替-1和 @987654348 @ 代替1会产生一个具有完全相同的值序列的排序数组。 -
另外,我在每次迭代期间转储的值也不会改变。
-
你查过我发的php源码了吗?这并不容易,但可以在那里找到快速排序的实现。无论如何,comparefunc 除了比较之外,不应该对数据做任何其他事情,我建议您不要在其中编写任何与顺序相关的代码。如果您需要特定的访问顺序,则必须实现自己的排序功能,但这会以性能为代价