Я бы не сказал, что ошибка в $x > $y
вместо $y < $x
.
Конечно, если вы реализовали $x > $y
таким образом, чтобы аргументы не обменивались позициями при передаче в функцию сравнения, вы бы решили эту конкретную проблему. Но вы получаете другой взамен.
Прямо сейчас у вас есть:
$x < $y <=> cmp($x, $y) == -1
$x > $y <=> cmp($y, $x) == -1
Поскольку первый ключ первого аргумента всегда сравнивается первым, оба условия выполняются, если reset($x) < $y[key($x)]
и reset($y) < $x[key($y)]
.
Но рассмотрим другую реализацию, которая решит эту проблему:
$x < $y <=> cmp($x, $y) == -1
$x > $y <=> cmp($x, $y) == +1
Теперь <
и >
согласованы, когда порядок операндов фиксирован, но теперь мы получаем странное поведение, когда меняем местами операнды, потому что у нас все еще могут быть cmp($x, $y) == -1
и cmp($y, $x) == -1
, что будет означать $x < $y
и $y < $x
оба будут истинными.
В итоге, единственным решением было бы установить функцию сравнения таким образом, чтобы ее поведение было антисимметричным, т. Е. Чтобы cmp($x, $y) == - cmp($y, $x)
, по крайней мере, в пределах набора элементов, которые, как утверждается, были сопоставимы.