如何使用我自己的预定义规则在PHP中对数组进行排序?

时间:2019-05-22 04:12:12

标签: php

我应该使用以下规则对给定的数组进行排序:

排序必须是不区分大小写的,并且首先将所有字符按字母顺序排列,然后按数字顺序排列,最后将所有其他字符按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

1 个答案:

答案 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”组合