Это не usort()
метод, предполагая, что ноль не имеет значения ...
<?php
$arr = array(-3, -4, 1, -1, 2, 4, -2, 3);
$positive = array_filter($arr, function($x) { return $x > 0; });
$negative = array_filter($arr, function($x) { return $x < 0; });
sort($positive);
rsort($negative);
$sorted = array_merge($positive, $negative);
print_r($sorted);
?>
РЕДАКТИРОВАТЬ: нет PHP 5.3? Используйте create_function()
как вы говорите:
$positive = array_filter($arr, create_function('$x', 'return $x > 0;'));
$negative = array_filter($arr, create_function('$x', 'return $x < 0;'));