开发者

How do I alphabetize a list of domains in this way?

So if I wanted to organize a list of websites alphabetically, and there were all of this form: example1.com, test.com, stackoverflow.com, google.com, it would be easy. However, I want to also organize subdomains. Consider the following three domains:

a.domain.com
domain.com
anotherdomain.com

If I handed them over to software to alphabetize, they would be alphabetized like this:

a.domain.com
anotherdomain.com
domain.com

However, this is not how I want them alphabetized. I want them to be alphabetized by domain, and then by subdomain as a "tiebreaker," in other words, like this:

anotherdomain.com
domain.com
a.domain.com

Could someone tell me how to code PHP (or JavaScript) to do this? (You can assume that each "website" is on开发者_JS百科 a fresh line of code.)


$array = array(
    'b.domain.com',
    'a.domain.com',
    'domain.com',
    'anotherdomain.com',
    'php.net',
    'example.com'
);

function sort_domains($domain1, $domain2)
{
    $domain1 = array_reverse(explode('.', $domain1));
    $domain2 = array_reverse(explode('.', $domain2));
    // set $i to 0 if you want the TLD to be sorted
    for($i = 1; ; $i++)
    {
        // Might be a good idea to store the value of the issets up here
        if(isset($domain1[$i]) && isset($domain2[$i]))
        {
            $difference = strcmp($domain1[$i], $domain2[$i]);
            if($difference != 0)
            {
                return $difference;
            }
            continue;
        }
        if(!isset($domain1[$i]) && !isset($domain2[$i]))
        {
            return 0;
        }
        return isset($domain1[$i]) ? 1 : -1;
    }
}

usort($array, 'sort_domains');

/*
Array
(
    [0] => anotherdomain.com
    [1] => domain.com
    [2] => a.domain.com
    [3] => b.domain.com
    [4] => example.com
    [5] => php.net
)
*/

Edit:

As per the suggestion of Alnitak, here is a version of sort_domains which caches the pieces of each domain name:

function sort_domains($domain1, $domain2)
{
    static $cache = array();
    if(!array_key_exists($domain1, $cache))
    {
        $cache[$domain1] = array_reverse(explode('.', $domain1));
    }
    if(!array_key_exists($domain2, $cache))
    {
        $cache[$domain2] = array_reverse(explode('.', $domain2));
    }
    // set $i to 0 if you want the TLD to be sorted
    for($i = 1; ; $i++)
    {
        $isset_1 = isset($cache[$domain1][$i]);
        $isset_2 = isset($cache[$domain2][$i]);
        if($isset_1 && $isset_2)
        {
            $difference = strcmp($cache[$domain1][$i], $cache[$domain2][$i]);
            if($difference != 0)
            {
                return $difference;
            }
            continue;
        }
        if(!$isset_1 && !$isset_2)
        {
            return 0;
        }
        return $isset_1 ? 1 : -1;
    }
}


If all the supplied arguments are of this form (and have no other information after the .com you could use explode('.', 'a.domain.com') and then you can sort the items according to the second to last item of the result of the explode.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜