We can transfer the problem with the array to the problem with the string and use a regular expression (regular expression) ... Indirectly, it checks all conditions and cases on state machines .
PS: when we have short arrays and a small number of cases, such an algorithm design is safe and offers a complete solution.
Oh yes, we can also translate week numbers into other languages ββ(see the $ lang parameter)!
Multilingual and regular expression
function weekNumbers_toStr($days, $lang='en') { $and = array('pt'=>'e', 'en'=>'and'); $strWeek = array( // config with more langs! 'pt'=>array("Segunda", "TerΓ§a", "Quarta", "Quinta", "Sexta", "SΓ‘bado", "Domingo"), 'en'=> array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") ); $days = array_unique($days); sort($days); $seq = preg_replace_callback( // Split sequence by ",": '/0246|024|025|026|135|146|246|02|03|04|05|06|13|14|15|16|24|25|26|35|36|46/', function ($m) { return join( ',' , str_split($m[0]) ); }, join('',$days) ); // split two or more days by "-": $seq = preg_replace('/(\d)\d*(\d)/', '$1-$2', $seq); $a = explode(',',$seq); $last = array_pop($a); $n = count($a); // Formating and translating: $seq = $n? join(", ",$a): $last; if ($last && $n) $seq = "$seq $and[$lang] $last"; return preg_replace_callback( '/\d/', function ($m) use (&$strWeek,$lang) { return $strWeek[$lang][$m[0]]; }, $seq ); } // func
Testing:
print "\n".weekNumbers_toStr(array(6,1,2,3,6),'en'); // corrects order and dups print "\n".weekNumbers_toStr(array(0,1,2,3,6)); // Monday-Thursday and Sunday print "\n".weekNumbers_toStr(array(3,4,6),'pt'); // Quinta-Sexta e Domingo print "\n".weekNumbers_toStr(array(3,4,6)); // Thursday-Friday and Sunday print "\n".weekNumbers_toStr(array(2,3,4,6)); // Wednesday-Friday and Sunday print "\n".weekNumbers_toStr(array(3,5)); // Thursday and Saturday print "\n".weekNumbers_toStr(array(0,2,4,6)); // Monday, Wednesday, Friday and Sunday print "\n".weekNumbers_toStr(array(0)); // Monday print "\n".weekNumbers_toStr(array()); // (nothing)