Return Int Not Bool

<?php

$array = range(0, 10);

usort($array, withBool(...));
print(implode(', ', $array)).PHP_EOL;
// 9, 10, 7, 8, 5, 6, 4, 3, 2, 1, 0

usort($array, withInt(...));
print(implode(', ', $array)).PHP_EOL;
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

function withBool($a, $b) : bool { return $a <=> $b; }

function withInt($a, $b) : int { return $a <=> $b; }

?>

There is a cute deprecation warning, when using a closure to sort an array: Deprecated: usort(): Returning ``bool from comparison function is deprecated, return an integer less than, equal to, or greater than zero``.

And if this deprecation is ignored, the boolean is cast automatically to an integer. As PHP turns 0 to false, and everything else, including 1 and -1 to true, this leads to surprising sorting effect.

Just trust the deprecation notice.

See Also

PHP Error Messages

PHP Features

Last updated: 14 July 2026