<?php
/**
* Task: Merge continuous numbers (sequences) in a given array into ranges.
* Assume the array is already sorted.
* Sample input: array( 1, 2, 3, 6, 8, 10, 11, 12 );
* Desired output: 1-3 6 8 10-12
*/
function make_index( $array )
{
// Pointers on first element
$startInterval = $previousElement = array_shift( $array );
// Walk through array
for( $n = 0; $n < $size; $n++ )
{
// Pointer to current element
$currentElement = $array[ $n ];
// Last element encountered OR interval stops at current element
if( $n + 1 == $size || // $n is last element
$previousElement + 1 != $currentElement ) // $currentElement is not continuous to $previousElement
{
// Determine range for an interval
if( $previousElement != $startInterval )
{
// $currentElement is last element, advance pointer to $previousElement
if( $n + 1 == $size )
$previousElement = $currentElement;
$ranges[] = "$startInterval-$previousElement";
}
else // Just take over a single element
$ranges[] = $previousElement;
// New interval starts here
$startInterval = $currentElement;
}
// Advance "pointer"
$previousElement = $currentElement;
}
return $ranges;
}
// Test
$sample = array( 1, 2, 3, 6, 8, 10, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 30, 32, 35, 36, 37 );
$ranges = make_index( $sample );
echo implode( ' ', $ranges ),"\n"; // Output: 1-3 6 8 10-12 15-22 30 32 35-37
?>