dongque1646 2011-04-11 16:24
浏览 60
已采纳

如何以这种方式按字母顺序排列域名列表?

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 a fresh line of code.)

  • 写回答

2条回答 默认 最新

  • dta43039 2011-04-11 16:41
    关注
    $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;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?