我有一个包含这样的数据的数组:
$arrs = Array("ABC_efg", "@@zzAG", "@$abc", "ABC_abc")
我试图以这种方式打印数据(按字母顺序打印):
[字符串以字符A开头]
ABC_abc
ABC_efg
[字符串以A到Z以外的字符开头]
@ $ ABC
@@ zzAG
答案 0 :(得分:3)
我将假设您的意思是以字母开头的字符串应该出现在所有其他字符串之前,否则所有字符串都应按标准顺序排序。
您使用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
)
答案 1 :(得分:0)
您编写了一个函数sortArray($array, $preset=1)
,它将$数组拆分为两个数组。
(默认情况下,$ preset应为空)
第一个数组包含所有以无特殊符号开头的元素,第二个数组包含以特殊符号开头的所有元素。您可以正常排序firstArray(sort()
)并打印它们,并在第二个数组上调用该函数,并传递预设。
(类似
if ($array[i][$preset] != "@") {
array_push ($firstArray ,$array[i]);
} else {
array_push ($secondArray ,$array[i]);
}
sort($firstArray);
print($firstArray);
sortArray($secondArray, $preset++);
)
这就是我的想法:)