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.)
Source: Tips4all
$array = array(
ReplyDelete'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;
}
}