Returning bool from comparison function is deprecated, return an integer less than, equal to, or greater than zero

Description

usort() requires a callback function, that is used to put set the order in the array. This function must return three different values:

  • 1 if $a > $b

  • 0 if $a == $b

  • -1 if $a < $b

The return type should be the integer subset [1, 0, -1], and since there is no such type in PHP, the int type shall be used.

This is exactly compatible with the spaceship operator <=>.

Also, note that any positive integer is considered as 1, and any negative integer is considered as -1.

This applies to usort(), uasort(), uksort().

Not that without declare(strict_types=), the integer result of the callback is converted into a boolean, where 1 and -1 are both true. This may lead to strange results.

Example

<?php

function foo($a, $b): bool { return $a > $b; }

$array = [4, 2, 3, 0];

usort($array, foo(...));

?>

Solutions

  • Use the int return type.

  • Remove the return type.

Changed Behavior

This error may appear following an evolution in behavior, in previous versions. See sortClosureReturnType.

Static Analysis

This error may be tracked down with the following static analysis rules: Php/ReturnTypeForSorting.