PHP自定义排序功能如何工作?

时间:2012-03-29 02:35:25

标签: php doctrine sorting quicksort

假设我想对某些项目进行排序,需要按优先级从最高到最低(5,3,2,1)对它们进行排序。因此,最高优先级5最终将在排序后存储在$ items [0]中。让我们说已经有了这个代码来对它进行排序:

$items = $items->sort(function(Item $a, Item $b)
{            
    if ($a->priority == $b->priority)
    {
        return 0;
    }

    return ($a->priority < $b->priority) ? 1 : -1;        
});

哪种方式有效,但我不知道为什么有效。

我假设返回0保持比较项目在其位置。返回1做什么?是否将排序后的数组向上移动到接近数组[0]的位置?返回-1将数组向下移动到接近数组[10]的数组?

或者它实际上是否移动$ b变量?


解决

好的,我在Pauly和phpdev的帮助下破解了它。它实际上移动了$ b变量,而不是回调函数中的$ a变量。所以我需要改变逻辑,这样才有意义。 -1将$ b向下移动数组,1向上移动数组$ b,0将$ b保持在同一位置。

$priorities = array(5, 8, 3, 10, 4, 3, 7);

usort($priorities, function($a, $b)
{
    if ($a == $b)
    {
        // Same priority, keep same
        echo "$a is same as $b, keeping the same\n";
        return 0;
    }
    else if ($a > $b)
    {
        // $a is higher priority, move $b down array
        echo "$a greater than $b, moving $b down array\n";
        return -1;
    }
    else {
        // $a is lower priority, move $b up array
        echo "$b greater than $a, moving $b up array\n";                
        return 1;
    }
});

var_dump($priorities);

输出:

10 greater than 8, moving 8 down array
10 greater than 7, moving 10 up array
10 greater than 3, moving 10 up array
10 greater than 4, moving 10 up array
10 greater than 5, moving 10 up array
10 greater than 3, moving 10 up array
10 greater than 8, moving 10 up array
5 greater than 3, moving 3 down array
7 greater than 5, moving 5 down array
8 greater than 5, moving 8 up array
5 greater than 4, moving 4 down array
5 greater than 3, moving 5 up array
5 greater than 4, moving 5 up array
8 greater than 7, moving 8 up array
4 greater than 3, moving 4 up array
3 is same as 3, keeping the same
4 greater than 3, moving 3 down array

array(7) {
  [0]=> int(10)
  [1]=> int(8)
  [2]=> int(7)
  [3]=> int(5)
  [4]=> int(4)
  [5]=> int(3)
  [6]=> int(3)
}

2 个答案:

答案 0 :(得分:3)

-1将其向下移动,0离开它,1将其向上移动。

http://www.php.net/manual/en/function.usort.php

答案 1 :(得分:2)

sort函数基本上遵循usort函数的排序函数签名。

PHP手册中的这一部分总结得最好:

  

比较函数必须返回小于,等于或的整数   如果第一个参数被认为是大于零   分别小于,等于或大于第二个。

当它返回0时,这意味着两个优先级都是相同的。