@ekaramazov

Как отсортировать массив по ближайшему числу?

Есть массив
$arr = array(
		array('id'=>1,'value'=>4),
		array('id'=>2,'value'=>6),
		array('id'=>3,'value'=>2.5),
		array('id'=>4,'value'=>-2),
		array('id'=>5,'value'=>3),
		array('id'=>6,'value'=>2.6),
		array('id'=>7,'value'=>3),
		array('id'=>8,'value'=>3),		
		array('id'=>9,'value'=>-3),		
	);

и число например 2,6 и нужно отсортировать массив так чтоб первыми были самые ближайшие к нему
usort($arr, function($a, $b){
            $c_v = 2.6;     
            return abs(($a['value'] - $c_v) - ($b['value'] - $c_v)); // тут возможно бред - уже изменял 100000 раз и запутался
        });

не получается отсортировать по ближайшим в массиве включая при этом отрицательные числа и float
должно получиться:
array('id'=>6,'value'=>2.6),
array('id'=>3,'value'=>2.5),
array('id'=>6,'value'=>4),
array('id'=>5,'value'=>3),
array('id'=>7,'value'=>3),
array('id'=>8,'value'=>3),
.........
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
0xD34F
@0xD34F
return abs(($a['value'] - $c_v) - ($b['value'] - $c_v)); // тут возможно бред - уже изменял 100000 раз и запутался

Да конечно бред.

Во-первых, вычислять надо не абсолютное значение разности разностей, а разность абсолютных значений разностей.

Во-вторых, если функция сравнения вернёт нецелый результат, он будет приведён к целому, которое - сюрприз, сюрприз - может и нулём оказаться, в этом случае сравниваемые значения будут сочтены равными, хотя это может быть и не так. Т.е., надо гарантировать возврат результата, неприводимого к нулю (если конечно, он изначально не является нулевым).

В общем, ваша сортировка могла бы выглядеть как-то так:
usort($arr, function($a, $b){
  $c_v = 2.6;
  return ceil(abs($a['value'] - $c_v) - abs($b['value'] - $c_v));
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@oxidmod
Зачем вам модуль?
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Zaymigo Нижний Новгород
от 20 000 до 100 000 руб.
Devmasterz Тюмень
от 80 000 до 120 000 руб.
21 июля 2018, в 18:06
10000 руб./за проект
21 июля 2018, в 15:32
1000 руб./за проект