@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),
.........
  • Вопрос задан
  • 95 просмотров
Решения вопроса 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));
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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