我试图了解php函数usort的工作原理。 我有这样的代码:
<?php
$users[] = array('login' => 'moon', 'name' => 'Chris');
$users[] = array('login' => 'star', 'name' => 'Piter');
$users[] = array('login' => 'mars', 'name' => 'Tim');
$users[] = array('login' => 'earth', 'name' => 'Garry');
function compare($a, $b) {
echo $a['login'] . '--' . $b['login'] . '<br />';
echo strcmp($a['login'], $b['login']) . '<br />';
return strcmp($a['login'], $b['login']);
}
usort($users, "compare");
echo '<pre>'; print_r($users); echo '</pre>';
?>
它会输出这样的结果:
star--moon
1
star--mars
1
earth--star
-1
moon--earth
1
mars--moon
-1
earth--mars
-1
Array
(
[0] => Array
(
[login] => earth
[name] => Garry
)
[1] => Array
(
[login] => mars
[name] => Tim
)
[2] => Array
(
[login] => moon
[name] => Chris
)
[3] => Array
(
[login] => star
[name] => Piter
)
)
据我所知,第二个param应该是比较函数,它只能返回3个值(-1,0,1)和usort
使用这个结果来排序数组?我也读过,usort
使用Quicksort实现来排序数组。这就是为什么明星是第一个而月亮 - 第二个? Quicksort将数组分成两部分然后对其进行排序?我可以为2,3维数组实现此功能吗?
答案 0 :(得分:2)
是的,usort使用比较函数,比较值并使用quicksort算法对数组进行排序。来自http://php.net/manual/en/function.usort.php:
如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。
可以在此处找到PHP中usort实现的链接:What sort algorithm does PHP use?。根据{{3}},算法使用中间元素作为枢轴元素,实现如下:
offset = (end - begin) >> 1;
这应该是算法使用'star'作为第一个枢轴元素的原因。
对于多维数组,如果要维护索引关联,请使用http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/。 uasort包含排序多维数组的示例。
答案 1 :(得分:1)
当你比较数组中的任何两个项目时,你告诉usort
首先放置哪个项目。您的函数返回元素的strcmp
值的login
比较,因此它会根据登录名将所有元素按字母顺序排列。