我应该使用以下规则对给定的数组进行排序:
排序必须是不区分大小写的,并且首先将所有字符按字母顺序排列,然后按数字顺序排列,最后将所有其他字符按ASCII顺序排列在3个组中。
我尝试了“ sort”和“ natcasesort”功能,但是结果却不是我所期望的。 我应该这样执行我的代码:
./ ssap2.php totu短裙4234“ _hop A2l + XXX” ##“ 1948372 AhAhAh”
(抱歉,代码错误,这是我在PHP上的第一天:))
/* function to split the given arguments */
function ft_split($string)
{
$arr = preg_split('/[\s]+/', $string);
return $arr;
}
$brut = array();
$alpha = array();
$numeric = array();
$other = array();
for ($i = 1; $i < $argc; $i++)
{
$brut = array_merge($brut, ft_split($argv[$i]));
}
foreach ($brut as $elem)
{
if (is_numeric($elem))
$numeric[] = $elem;
else if (ctype_alpha($elem))
$alpha[] = $elem;
else
$other[] = $elem;
}
sort($numeric);
natcasesort($alpha);
sort($other);
foreach ($alpha as $word)
echo $word."\n";
foreach ($numeric as $word)
echo $word."\n";
foreach ($other as $word)
echo $word."\n";
?>
我希望这样:
$> ./ssap2.php totu短裙4234“ _hop A2l + XXX” ##“ 1948372 AhAhAh”
AhAhAh
A2l +
toto
tutu
XXX
1948372
4234
_hop
答案 0 :(得分:2)
您可以尝试使用此功能:
function ft_compare($s1, $s2)
{
$map = "abcdefghijklmnopqrstuvwxyz0123456789 !\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~";
$s1 = strtolower($s1);
$s2 = strtolower($s2);
$len1 = strlen($s1);
$len2 = strlen($s2);
while ($i < $len1)
{
if ($i >= $len2)
return 1;
$pos1 = strpos($map, $s1[$i]);
$pos2 = strpos($map, $s2[$i]);
if ($pos1 < $pos2)
return -1;
else if ($pos1 > $pos2)
return 1;
$i++;
}
return 0;
}
与“ usort”组合