How to organize the list of domains in this way?

So, if I wanted to organize the list of websites alphabetically, and all of them would be like this: example1.com, test.com, stackoverflow.com, google.com, that would be easy. However, I also want to organize subdomains. Consider the following three areas:

a.domain.com domain.com anotherdomain.com 

If I transferred them to the software in alphabetical form, they would be in alphabetical order as follows:

 a.domain.com anotherdomain.com domain.com 

However, I do not want them to be in alphabetical order. I want them to be in alphabetical order by domain, and then by subdomain as a "tie-breaker", in other words, like this:

 anotherdomain.com domain.com a.domain.com 

Can someone tell me how to make PHP (or JavaScript) code for this? (It can be assumed that each β€œwebsite” is on a new line of code.)

+7
source share
2 answers
 $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 suggested by Alnitak, here is a version of sort_domains that caches chunks 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; } } 
+7
source

If all the arguments provided have this form (and after .com there is no other information, you can use explode('.', 'a.domain.com') , and then you can sort the elements according to the second to last element of the explosion result.

+1
source

All Articles