getId()); $pathB = explode(':', $b->getId()); $min = min(count($pathA), count($pathB)); for ($i = 0; $i < $min; $i++) { if ($pathA[$i] !== $pathB[$i]) { return $pathA[$i] <=> $pathB[$i]; } } return count($pathA) <=> count($pathB); } /** * Comparator to sort namespace first, then by ID * * @param AbstractNode $a * @param AbstractNode $b * @return int */ public static function sortByNsFirstThenId(AbstractNode $a, AbstractNode $b): int { $res = self::sortByNsFirst($a, $b); if ($res === 0) $res = self::sortById($a, $b); return $res; } /** * Comparator to sort by title (using natural sort) * * @param AbstractNode $a * @param AbstractNode $b * @return int */ public static function sortByTitle(AbstractNode $a, AbstractNode $b): int { return Sort::strcmp($a->getTitle(), $b->getTitle()); } /** * Comparator to sort namespace first, then by title * * @param AbstractNode $a * @param AbstractNode $b * @return int */ public static function sortByNsFirstThenTitle(AbstractNode $a, AbstractNode $b): int { $res = self::sortByNsFirst($a, $b); if ($res === 0) $res = self::sortByTitle($a, $b); return $res; } /** * Comparator to sort by namespace first * * @param AbstractNode $a * @param AbstractNode $b * @return int */ protected static function sortByNsFirst(AbstractNode $a, AbstractNode $b): int { $isAaNs = ($a instanceof WikiNamespace); $isBaNs = ($b instanceof WikiNamespace); if ($isAaNs !== $isBaNs) { if ($isAaNs) { return -1; } elseif ($isBaNs) { return 1; } } return 0; } }