首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将"3-6“或"3-6,12”形式的范围或部分数组转换为整数数组,如3,4,5,6,12

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

Stack Overflow用户
提问于 2011-10-09 01:52:50
回答 7查看 2.5K关注 0票数 8

我对这个有点困惑,目前我正在努力在网上找到任何类似的例子。

在PHP中工作时,我希望在表单中输入“值列表”、“范围”或两者的组合,可能来自表单字段;

代码语言:javascript
复制
3,5,6,9,11,23

代码语言:javascript
复制
3-20

代码语言:javascript
复制
3-6,8,12,14-50

我想以整数数组的形式返回它们,例如

代码语言:javascript
复制
3,4,5,6,8,12,14,15,16...

我不会把它们都打出来,但是这个想法很明显!

有没有一个函数可以做到这一点,或者我应该从哪里开始编写一个函数?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-10-09 02:26:57

您可能正在寻找range函数和implode

代码语言:javascript
复制
$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);

为您提供:

代码语言:javascript
复制
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

Demo

工作原理:字符串中基本上有两个标记: range-token (1-n) (定义为:(\d+)-(\d+))和回退(任何其他标记)。

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

之后,字符串就变成了一种规范化的格式,你可以直接对其进行explode

代码语言:javascript
复制
// as array:

print_r(explode(',', $result));

Full Demo

票数 15
EN

Stack Overflow用户

发布于 2015-02-25 08:22:09

下面是hakre's excellent answer的形式化/公式

代码语言:javascript
复制
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参数,以便您可以像这样给它提供输入:

代码语言:javascript
复制
$in = "2,4,6-8, 12-";
$out = rangesToList($in, 14);

然后得到这个

代码语言:javascript
复制
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 7
    [4] => 8
    [5] => 12
    [6] => 13
    [7] => 14
)
票数 2
EN

Stack Overflow用户

发布于 2011-10-09 02:16:17

代码语言:javascript
复制
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;
}

结果:

代码语言:javascript
复制
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
)

顺便说一下,它没有错误报告,你可以自己把它放进去:)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7698664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档