我对这个有点困惑,目前我正在努力在网上找到任何类似的例子。
在PHP中工作时,我希望在表单中输入“值列表”、“范围”或两者的组合,可能来自表单字段;
3,5,6,9,11,23或
3-20或
3-6,8,12,14-50我想以整数数组的形式返回它们,例如
3,4,5,6,8,12,14,15,16...我不会把它们都打出来,但是这个想法很明显!
有没有一个函数可以做到这一点,或者我应该从哪里开始编写一个函数?
发布于 2011-10-09 02:26:57
$input = '3,5,6,9,11,23,14-77';
$result = preg_replace_callback('/(\d+)-(\d+)/', function($m) {
return implode(',', range($m[1], $m[2]));
}, $input);为您提供:
3,5,6,9,11,23,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77工作原理:字符串中基本上有两个标记: range-token (1-n) (定义为:(\d+)-(\d+))和回退(任何其他标记)。
preg_replace_callback允许通过回调函数扩展令牌字符串。然后,该回调函数使用PHP的range函数和implode将两个匹配的数值扩展为逗号分隔的列表。
之后,字符串就变成了一种规范化的格式,你可以直接对其进行explode:
// as array:
print_r(explode(',', $result));发布于 2015-02-25 08:22:09
下面是hakre's excellent answer的形式化/公式
function rangesToList($a, $max) {
$a = trim($a);
if (isset($max) && substr($a, -1) == "-") {
$a .= $max;
}
$r = preg_replace_callback('/(\d+)-(\d+)/', function($m) {
return implode(',', range($m[1], $m[2]));
}, $a);
return array_map('intval', explode(",", $r));
}除了被封装到公式中并且更健壮之外,它还接受一个可选的$max参数,以便您可以像这样给它提供输入:
$in = "2,4,6-8, 12-";
$out = rangesToList($in, 14);然后得到这个
Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 7
[4] => 8
[5] => 12
[6] => 13
[7] => 14
)发布于 2011-10-09 02:16:17
function list2array ($list) {
$array = explode(',', $list);
$return = array();
foreach ($array as $value) {
$explode2 = explode('-', $value);
if (count($explode2) > 1) {
$range = range($explode2[0], $explode2[1]);
$return = array_merge($return, $range);
} else {
$return[] = (int) $value;
}
}
return $return;
}结果:
php > print_r(list2array('3-6,8,12,14-50'));
Array
(
[0] => 3
[1] => 4
[2] => 5
[3] => 6
[4] => 8
[5] => 12
[6] => 14
[7] => 15
[...]
[41] => 49
[42] => 50
)顺便说一下,它没有错误报告,你可以自己把它放进去:)。
https://stackoverflow.com/questions/7698664
复制相似问题