Все довольно просто.
<?php
usort($items, function ($a, $b) {
$aStartsWithNumber = preg_match('/^\s*(\d+)/u', $a, $aMatch);
$bStartsWithNumber = preg_match('/^\s*(\d+)/u', $b, $bMatch);
// Оба начинаются с числа → сравниваем по числу
if ($aStartsWithNumber && $bStartsWithNumber) {
return (int)$aMatch[1] <=> (int)$bMatch[1];
}
// Только $a начинается с числа → он раньше
if ($aStartsWithNumber) {
return -1;
}
// Только $b начинается с числа → он раньше
if ($bStartsWithNumber) {
return 1;
}
// Ни один не начинается с числа → сортируем по алфавиту без учета регистра
return mb_strtolower($a) <=> mb_strtolower($b);
});