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));
});