Я предполагаю, что вы имеете в виду, что строки, начинающиеся с буквы, должны появиться до того, как все остальные строки будут отсортированы в обычном порядке.
Вы используете usort()
и определяете пользовательскую функцию для заказа и ctype_alpha()
, чтобы определить, является ли что-то буквой или нет.
$arrs = Array("ABC_efg", "@@zzAG", "@$abc", "ABC_abc");
usort($arrs, 'order_alpha_first');
function order_alpha_first($a, $b) {
$lenA = strlen($a);
$lenB = strlen($b);
$len = min($lenA, $lenB);
$i = 0;
while ($a[$i] == $b[$i] && $i < $len) {
$i++;
}
if ($i == $len) {
if ($lenA == $lenB) {
return 0; // they're the same
} else {
return $lenA < $lenB ? -1 : 1;
}
} else if (ctype_alpha($a[$i])) {
return ctype_alpha($b[$i]) ? strcmp($a[$i], $b[$i]) : -1;
} else {
return ctype_alpha($b[$i]) ? 1 : strcmp($a[$i], $b[$i]);
}
}
Выход:
Array
(
[0] => ABC_abc
[1] => ABC_efg
[2] => @$abc
[3] => @@zzAG
)