Inkognitoss
@Inkognitoss
Full-stack разработчик.

Почему uasort отрабатывает не так как ожидается?

Работал с uasort, метод меня всегда выручает, но вот тут я наткнулся на такой вот кейс, и не могу понять, почему метод отрабатывает как бы задом наперед.
$ar = [8,0,8,0,8,0,8,0,8,0];
uasort($ar, function ($a, $b) {
	if($a===8&&$b!==8)
		$ret = 1;
	elseif($a===8&&$b===8){
		$ret =0;
	}else{
		$ret = -1;
	}

	return $ret;
});
pre($ar);

вывод:
Array
(
[5] => 0
[3] => 0
[9] => 0
[7] => 0
[1] => 0
[8] => 8
[4] => 8
[2] => 8
[0] => 8
[6] => 8
)

но почему, ведь я как бы моделирую ситуацию, когда $a со значением 8 должно быть больше всего остального .
  • Вопрос задан
  • 916 просмотров
Решения вопроса 1
DevMan
@DevMan
1 двигает элемент вниз массива, -1 двигает элемент вверх массива, 0 оставляет на месте.
простыми словами: сортировка происходит по возрастанию.
так как 0 меньше 8 то они и расположены в начале массива.
если нужна сортировка по убыванию, нужно изменить логику (возвращать -1 если элемент больше), что и продемонстрировал Александр Аксентьев
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
qonand
@qonand
Software Engineer
не могу понять, почему метод отрабатывает как бы задом наперед

насколько я понял Вы имеет ввиду что порядок ключей не сохранен. Ну так это и не удивительно в доке
написано "Если оба сравниваемых значения эквивалентны, то порядок их в отсортированном массиве не определен.", если Вы хотите узнать по какому принципу формируется порядок ключей - копайте исходники функции uasort
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
<?php
$ar = [8,0,8,0,8,0,8,0,8,0];
uasort($ar, function ($a, $b) {
  if($a===8&&$b!==8)
    $ret = -1;
  elseif($a===8&&$b===8){
    $ret =0;
  }else{
    $ret = 1;
  }

  return $ret;
});
var_dump($ar);


дебажить конечно ничего не буду
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы