将范围为"3-6"或"3-6,12"的范围或部分数组转换为整数数组,如3,4,5,6,12

Mat*_*ins 7 php arrays

我对这个感到有些困惑,我现在很难在网上找到类似的例子.

在PHP中工作,我希望从形式字段中获取输入,可以是表单中的"值列表","范围"或两者的组合;

3,5,6,9,11,23
Run Code Online (Sandbox Code Playgroud)

要么

3-20
Run Code Online (Sandbox Code Playgroud)

要么

3-6,8,12,14-50
Run Code Online (Sandbox Code Playgroud)

我想将这些作为整数数组返回,例如

3,4,5,6,8,12,14,15,16...
Run Code Online (Sandbox Code Playgroud)

我不打算把它们全部输出,但这个想法很明显!

是否有可用的功能,或者我从哪里开始写一个?

hak*_*kre 12

你可能正在寻找这个range功能implode:

$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);
Run Code Online (Sandbox Code Playgroud)

给你:

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
Run Code Online (Sandbox Code Playgroud)

演示

它是如何工作的:你基本上在字符串中两个令牌:范围令牌(1-n)(定义为正则表达式:(\d+)-(\d+))和回退(别的).

preg_replace_callback允许通过回调函数扩展令牌字符串.然后,该回调函数只使用PHP的range函数将两个匹配的数值扩展到逗号分隔的列表中implode.

之后,字符串采用标准化格式,您可以explode:

// as array:

print_r(explode(',', $result));
Run Code Online (Sandbox Code Playgroud)

完整的演示