Ads removed from the pastie. \o/
Running costs stayed. :-(
Donations welcome!

Bitcoin: 1QC38uPBSy7WSYz1whM5SYTHAdhqkN6o8V
Ethereum: 0x0855778a6181a69cc7d5d08c71c4f5846010eb67
Verge: D8fo1fszrNmUK4kfQW5owhYMv3osPvgn2g
Recent entries
2020-03-31 18:36:07
movie
2020-03-31 17:55:21
https://medium.com/@jeann...
2020-03-31 17:54:38
chjyjhj
2020-03-31 17:48:25
BERKAHBERSEDEKAH
2020-03-31 17:47:47
https://medium.com/@jeann...
2020-03-31 17:46:05
movie
2020-03-31 17:41:55
https://medium.com/@jeann...
2020-03-31 17:28:38
No title specified
2020-03-31 17:23:48
No title specified
2020-03-31 17:12:00
harry potter 6 streaming ...
Permanent entries
2019-10-14 13:05:09
Shift-JIS to UTF-8 mappin...
2014-10-14 21:12:28
Boost property tree - Ite...
2013-10-18 08:24:21
Resize images in a folder...
2013-04-29 17:23:35
Find bad words in a text,...
2013-02-12 20:26:45
Merge two boost property ...
2012-12-18 16:21:40
OpenCV: Access/modify ima...
2012-11-19 10:48:40
Reading a boost::property...
2012-04-10 00:11:46
Convert hex to string or ...
2012-02-18 00:12:04
Screw up []-operator for ...
2012-02-16 03:02:24
Merge continuous numbers ...
2012-01-18 22:26:01
(PHP) Generate / Create (...
2011-04-19 16:05:25
Calculate one's age in ye...
2011-04-18 15:26:45
(PHP) Generate / Create r...
2010-08-26 15:18:00
Pick the first element (k...
2010-07-28 10:36:45
Quakenet - Snailbot comma...
2010-06-21 21:30:52
Using the MATLAB profiler...
2010-05-31 06:31:14
PHP truncation function
2010-05-06 20:49:26
Quakenet - Fishbot comman...
Paste ID: # 2WKwk
Date posted: Thu, 16 Feb 2012 03:02:24 +0000
Date of expiration: never (permanent entry)
Description:

Merge continuous numbers (sequences) in a given array into ranges. (PHP)

  1. <?php
  2. /**
  3.  * Task:           Merge continuous numbers (sequences) in a given array into ranges.
  4.  *                 Assume the array is already sorted.
  5.  * Sample input:   array( 1, 2, 3, 6, 8, 10, 11, 12 );
  6.  * Desired output: 1-3 6 8 10-12
  7.  */
  8. function make_index( $array )
  9. {
  10.   // Pointers on first element
  11.   $startInterval = $previousElement = array_shift( $array );
  12.   $size = count( $array );
  13.  
  14.   // Walk through array
  15.   for( $n = 0; $n < $size; $n++ )
  16.   {
  17.     // Pointer to current element
  18.     $currentElement = $array[ $n ];
  19.  
  20.     // Last element encountered OR interval stops at current element
  21.     if( $n + 1 == $size ||                      // $n is last element
  22.       $previousElement + 1 != $currentElement ) // $currentElement is not continuous to $previousElement
  23.     {
  24.       // Determine range for an interval
  25.       if( $previousElement != $startInterval )
  26.       {
  27.         // $currentElement is last element, advance pointer to $previousElement
  28.         if( $n + 1 == $size )
  29.           $previousElement = $currentElement;
  30.         $ranges[] = "$startInterval-$previousElement";
  31.       }
  32.       else // Just take over a single element
  33.         $ranges[] = $previousElement;
  34.  
  35.       // New interval starts here
  36.       $startInterval = $currentElement;
  37.     }
  38.     // Advance "pointer"
  39.     $previousElement = $currentElement;
  40.   }
  41.   return $ranges;
  42. }
  43.  
  44. // Test
  45. $sample = array( 1, 2, 3, 6, 8, 10, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 30, 32, 35, 36, 37 );
  46. $ranges = make_index( $sample );
  47. echo implode( ' ', $ranges ),"\n"; // Output: 1-3 6 8 10-12 15-22 30 32 35-37
  48. ?>
You can paste a correction or amendment to the upper paste or a new paste down below.