usort и uasort ?

sunyang

Новичок
в документации
в функцию сортировки передаются два параметра ($a, $b):
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}

uasort($array, 'cmp');

Не пойму, что они означают - это ключ и значение массива передаются в функцию?
 

WMix

герр M:)ller
Партнер клуба
usort

два параметра ($a, $b) это два элемента масива..
PHP:
// Функция сравнения
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

// Сортируемый массив
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);

// Сортируем и выводим получившийся массив
uasort($array, 'cmp');
print_r($array);
cmp($a, $b) будет принимать значения (4, 8), (4, -1) ... и тд пока не сравнит все элементы масива друг с другом

попробуй так
PHP:
// Функция сравнения
function cmp($a, $b) {
    echo 'a: '.$a.' b:'.$b."\n";
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
 

Вурдалак

Продвинутый новичок
Вот есть у тебя массив из объектов класса "Чувак".
PHP:
class Dude {
    public function getAge();
    public function getWeight();
    public function getHeight();
}

$a = array(new Dude(20, 70, 180), new Dude(29, 82, 184), new Dude(22, 75, 175));
И ты такой: «Хочу по росту их отсортировать!». Ты смотришь на двух чуваков: один 180, а другой — 184.

Кто из них ниже? Если левый, то возврати число меньше нуля, если правый — больше нуля, если они одинаковы — то 0.
PHP:
usort(function (Dude $dude1, Dude $dude2) {
    return $a->getHeight() - $b->getHeight();
}, $a);
— выполняется? Выполняется.
 

sunyang

Новичок
Ну то, что он сравнивает все элементы массива между собой, это я понял.

А что происходит,если функция вернет 1, 0 или -1 ?
 

Вурдалак

Продвинутый новичок
А что происходит,если функция вернет 1, 0 или -1 ?
Это не должно тебя беспокоить, это зависит от алгоритма сортировки. В простейшем случае эти два элемента будут меняться местами, если левый больше правого, то есть если функция возвращает больше нуля, либо останутся на своих местах в противном случае.
 

sunyang

Новичок
как мне тогда реализовать вот это:
есть массив:

PHP:
$a = array(3, 2, 5, 6, 42, 153, 42, 1, 2, 12, 42, 14, 5, 153);
Мне нужно отсортировать этот массив таким образом, чтобы элементы со значениями 153 и 42 были вначале массива, остальные после - них.
 

Вурдалак

Продвинутый новичок
PHP:
static $exceptionList = array(153, 42);

if (in_array($a, $exceptionList))
    return -1;

if (in_array($b, $exceptionList))
    return 1;

// ...
 

Andkorol

Новичок
PHP:
$a = array(3, 2, 5, 6, 42, 153, 42, 1, 2, 12, 42, 14, 5, 153);
Мне нужно отсортировать этот массив таким образом, чтобы элементы со значениями 153 и 42 были вначале массива, остальные после - них.
С точки зрения логики можешь такой способ сортировки как-нибудь объяснить?:D
PS: не, ну 42 ещё понятно – это ответ на Главный вопрос, потому его вперед нужно...
а 153 почему..?:)
 

WMix

герр M:)ller
Партнер клуба
PHP:
// Функция сравнения
function cmp($a, $b) {
// голова не работает, но чтот такое!
    if( $a == 153 ) return -1;
    elseif( $a == 42 && $b != 153 ) return -1;
    elseif( $a == 42 && $b == 153 ) return 1;

    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
уверен 153 это еще одно шаманское число, известное в других кругах!

а вурдалаг уже ответил же ))
 

WMix

герр M:)ller
Партнер клуба
Andkorol
С точки зрения логики можешь такой способ сортировки как-нибудь объяснить?
все можно обьяснить!
все у кого лотерейные билеты 153, получают первое место, у кого 42 2е... ну кто остался без подарка позади
 

Andkorol

Новичок
все можно обьяснить!
все у кого лотерейные билеты 153, получают первое место, у кого 42 2е... ну кто остался без подарка позади
Глубокая мысль...:D
Вопрос был "С точки зрения логики" – а не путем констатирования фактов, что "153 – 1-е место, 42 – 2-е, остальные – патом, да!".
Это просто определения – логики в них я не вижу.
 

Sufir

Я не волшебник, я только учусь
Глубокая мысль...:D
Вопрос был "С точки зрения логики" – а не путем констатирования фактов, что "153 – 1-е место, 42 – 2-е, остальные – патом, да!".
Это просто определения – логики в них я не вижу.
Это потому-что не у тебя 153 билет.
 

sunyang

Новичок
Это нужно, чтобы поднять элементы вверх ТОЛЬКО со значением или X или Y или Z.
Нужно это для сортировки.

Это конечно хорошо, но так и не понятно, что делает функция сортировки, если возвращается return -1 или return 1 или return 0
Что с чем она меняет местами?
 
Сверху