Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shortening list of numbers with hyphens between consecutive numbers

Is there a simple way to take a list of numbers which can be in the range 1 - 15. And put a dash in place of consecutive numbers.

So that for example if you had the following numbers:

1 2 3 5 6 7 10 12

It would output

1 - 3, 5 - 7, 10, 12

like image 705
user1096685 Avatar asked Feb 25 '12 21:02

user1096685


2 Answers

<?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]);
  }
like image 85
Tim Landscheidt Avatar answered Sep 28 '22 23:09

Tim Landscheidt


$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;
}

The function with explode:

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>');
like image 37
biziclop Avatar answered Sep 28 '22 23:09

biziclop