Вам нужен иной подход, чем ваша первоначальная мысль. Вместо рекурсивной сортировки, сделайте только одну сортировку, которая учитывает все ваши критерии сразу, ранжированным способом (т. Е. Если x одно и то же, проверьте y и т. Д.) .
Другие уже указали на функции сортировки, которые принимают в качестве аргумента такую называемую функцию сравнения . Функция сравнения получает два ваших объекта и возвращает объект, который меньше / больше другого.
В коде, который вы разместили, у вас есть это сравнение:
if($v->$sortKey < $pivot->$sortKey)
Вместо теста $ v -> $ sortKey <$ pivot -> $ sortKey вам нужен вызов вашей собственной функции сравнения, например,
if (smaller($v, $pivot))
В функции smaller()
вы определяете свои правила.
private function smaller($obj1, $obj2) {
if ($obj1->x < $obj2->x)
return true;
if ($obj1->x > $obj2->x)
return false;
if ($obj1->y < $obj2->y)
return true;
if ($obj1->y > $obj2->y)
return false;
}
... и так далее. Как вы можете видеть, сортировка обеспечит упорядочение по x, и в случае, если x одно и то же (не меньше, не больше), продолжайте упорядочивать по y.