Как работает функция пользовательской сортировки PHP? - PullRequest
1 голос
/ 29 марта 2012

Допустим, я хочу отсортировать некоторые элементы и нужно отсортировать их по приоритету от наивысшего к низшему (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 сохраняет сравниваемый элемент на своем месте.Что делает return 1?Перемещает ли $ a вверх отсортированный массив ближе к массиву [0]?И возврат -1 перемещает $ a вниз по массиву ближе к массиву [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 ]

3 голосов
/ 29 марта 2012

-1 сдвигает его вниз, 0 оставляет, 1 толкает вверх.

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

2 голосов
/ 29 марта 2012

Функция сортировки в основном следует сигнатуре функции сортировки функции usort .

Эта часть из руководства PHP лучше всего суммирует:

Функция сравнения должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.

А когда возвращается0, это означает, что оба приоритета одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...