Intereting Posts

Сокращение списка чисел с дефисом между последовательными номерами

Есть простой способ взять список чисел, который может находиться в диапазоне 1 – 15. И поставить тире вместо последовательных чисел.

Так, например, если у вас были следующие номера:

1 2 3 5 6 7 10 12

Он будет выводить

1 - 3, 5 - 7, 10, 12

 <?php $n = array (1, 2, 3, 5, 6, 7, 10, 12); sort ($n); // If necessary. $i = 0; while ($i < count ($n)) { if ($i != 0) print (", "); $rangestart = $i; print ($n [$i++]); while ($i < count ($n) && $n [$i] == $n [$i - 1] + 1) $i++; if ($i > $rangestart + 1) print (" - " . $n [$i - 1]); } 
 $n = array (1, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 16, 17); $lastindex = count($n)-1; foreach($n as $k => $i) { if($k == 0) echo $i; elseif($i != $n[$k-1]+1) echo ', ' . $i; elseif($k == $lastindex || $i+1 != $n[$k+1]) echo ' - ' . $i; } 

Функция с взрывом:

http://codepad.org/DKztLGhe

 function shorten( $numbers ){ $a = explode(' ',$numbers); $lastindex = count($a)-1; $s = ''; foreach( $a as $i => $n ){ if( $i == 0 ) $s .= $n; else if( $a[$i-1]+1 != $n ) $s .= ', '.$n; else if( $i == $lastindex || $n+1 != $a[$i+1] ) $s .= ' - '.$n; } return $s; } print_r(shorten('').'<br>'); print_r(shorten('1').'<br>'); print_r(shorten('1 2').'<br>'); print_r(shorten('1 3').'<br>'); print_r(shorten('1 3 4 6').'<br>'); print_r(shorten('1 3 4 6 7').'<br>'); print_r(shorten('1 2 3 4 5').'<br>'); print_r(shorten('1 2 3 5 6 10 12 13').'<br>');