我试图了解 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
)
)
据我了解,第二个参数应该是比较函数,它只能返回3个值(-1,0,1),并且usort
使用这个结果对数组进行排序?我还读到,usort
使用 Quicksort 实现对数组进行排序。这就是为什么星星排在第一位,而月亮排在第二位?快速排序将数组分成两部分然后排序?我可以为 2,3 维数组实现这个函数吗?
最佳答案
是的,usort 使用比较函数来比较值并对数组进行排序 quicksort算法。来自 http://php.net/manual/en/function.usort.php :
The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
可以在此处找到 PHP 中 usort 实现的链接:What sort algorithm does PHP use? 。根据http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/该算法使用中间元素作为枢轴元素,实现如下:
offset = (end - begin) >> 1;
这应该就是算法使用“star”作为第一个主元元素的原因。
对于多维数组,请使用uasort如果你想维护索引关联。 This question包含对多维数组进行排序的示例。
关于php - 如何理解usort逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267990/