Created
June 8, 2009 01:06
-
-
Save jaywilliams/125557 to your computer and use it in GitHub Desktop.
Parse a string, and convert it into a series of sequential numbers.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Parse a string, and convert it into a series of sequential numbers. | |
* It works similar to Acrobat's print specified pages input box. | |
* | |
* Examples: | |
* | |
* input: "1, 2, 3, 4, 5, 6" --> output: 1, 2, 3, 4, 5, 6 | |
* input: "1-6" --> output: 1, 2, 3, 4, 5, 6 | |
* input: "1-6" --> output: 1, 2, 3, 4, 5, 6 | |
* input: "1 - -6" --> output: 1, 2, 3, 4, 5, 6 | |
* input: "0 - 0" --> output: 0 | |
* input: "1, 4-6, 2" --> output: 1, 2, 4, 5, 6 | |
* input: "6,3-1" --> output: 1, 2, 3, 6 | |
* | |
* // Sample Usage: | |
* $range = range_string("6, 3-1"); | |
* | |
* @author Jay Williams <myd3.com> | |
* @license MIT License | |
* @link http://gist.github.com/125557 | |
*/ | |
define('RANGE_ARRAY_SORT', 1); | |
define('RANGE_ARRAY', 2); | |
define('RANGE_STRING_SORT', 3); | |
define('RANGE_STRING', 4); | |
function range_string($range_str, $output_type = RANGE_ARRAY_SORT) | |
{ | |
// Remove spaces and nother non-essential characters | |
$find[] = "/[^\d,\-]/"; | |
$replace[] = ""; | |
// Remove duplicate hyphens | |
$find[] = "/\-+/"; | |
$replace[] = "-"; | |
// Remove duplicate commas | |
$find[] = "/\,+/"; | |
$replace[] = ","; | |
$range_str = preg_replace($find, $replace, $range_str); | |
// Remove any commas or hypens from the end of the string | |
$range_str = trim($range_str,",-"); | |
$range_out = array(); | |
$ranges = explode(",", $range_str); | |
foreach($ranges as $range) | |
{ | |
if(is_numeric($range) || strlen($range) == 1) | |
{ | |
// Just a number; add it to the list. | |
$range_out[] = (int) $range; | |
} | |
else if(is_string($range)) | |
{ | |
// Is probably a range of values. | |
$range_exp = preg_split("/(\D)/",$range,-1,PREG_SPLIT_DELIM_CAPTURE); | |
$start = $range_exp[0]; | |
$end = $range_exp[2]; | |
if($start > $end) | |
{ | |
for($i = $start; $i >= $end; $i -= 1) | |
{ | |
$range_out[] = (int) $i; | |
} | |
} | |
else | |
{ | |
for($i = $start; $i <= $end; $i += 1) | |
{ | |
$range_out[] = (int) $i; | |
} | |
} | |
} | |
} | |
switch ($output_type) { | |
case RANGE_ARRAY_SORT: | |
$range_out = array_unique($range_out); | |
sort($range_out); | |
case RANGE_ARRAY: | |
return $range_out; | |
break; | |
case RANGE_STRING_SORT: | |
$range_out = array_unique($range_out); | |
sort($range_out); | |
case RANGE_STRING: | |
default: | |
return implode(", ", $range_out); | |
break; | |
} | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment