首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:有没有一种简单的方法将数字列表(如"1-3,5,7-9")解析为数组?

PHP:有没有一种简单的方法将数字列表(如"1-3,5,7-9")解析为数组?
EN

Stack Overflow用户
提问于 2011-10-19 18:47:42
回答 5查看 2.3K关注 0票数 5

我试着在这里和谷歌上搜索这个,所以如果我错过了一些明显的东西,我很抱歉。我可能根本不知道这些数字的格式名称。

我想要做的是从一个字符串开始,比如"1-3,5,7-9“,并让它变成一个PHP数组,包含以下条目: 1,2,3,5,7,8,9

我知道如何在逗号上使用preg_split,然后遍历和展开任何标记,但我觉得一定有更简单/更好的方法。

编辑

我没有说清楚,但是字符串需要包括跨度!这意味着如果我的字符串是"1-9“,那么我得到的数组应该是"1,2,3,4,5,6,7,8,9”,而不仅仅是"1,9“。抱歉之前没说清楚。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-19 18:58:23

不太清楚你所说的“扩张”是什么意思。不管怎样,我会用exploderange做这件事

代码语言:javascript
复制
$input = '1-3,5,7-9';
$output = array();

foreach (explode(',', $input) as $nums) {
    if (strpos($nums, '-') !== false) {
        list($from, $to) = explode('-', $nums);
        $output = array_merge($output, range($from, $to));
    } else {
        $output[] = $nums;
    }
}

如果有更好的方法不使用eval (或PCRE e修饰符),我不知道。

为了娱乐起见,这里有一个一行(不幸地使用eval)返回相同的结果,但是.

免责声明:在大多数情况下不建议使用eval,因为它会造成安全风险和其他问题。,我不会用它,,但是它仍然是可行的。

话虽如此,如下所述:

代码语言:javascript
复制
$output = explode(',', preg_replace('/([0-9]*)-([0-9]*)/e', 'implode(",", range($1, $2));', $input));
票数 11
EN

Stack Overflow用户

发布于 2014-07-14 21:11:08

上面的例程运行良好,但有一些缺点:

字符串中的

  1. 空格打乱了例程
  2. 的重复项没有被删除,例如,5,4-7给出5,4,5,6,7
  3. ,数字没有排序。

我修改了代码以解决以下问题:

代码语言:javascript
复制
function parsenumbers($input)
{
    /*
     * This routine parses a string containing sets of numbers such as:
     * 3
     * 1,3,5
     * 2-4
     * 1-5,7,15-17
     * spaces are ignored
     * 
     * routine returns a sorted array containing all the numbers
     * duplicates are removed - e.g. '5,4-7' returns 4,5,6,7
     */
    $input = str_replace(' ', '', $input); // strip out spaces
    $output = array();
    foreach (explode(',', $input) as $nums)
    {
        if (strpos($nums, '-') !== false)
        {
            list($from, $to) = explode('-', $nums);
            $output = array_merge($output, range($from, $to));
        }
        else
        {
            $output[] = $nums;
        }
    }

    $output = array_unique($output, SORT_NUMERIC); // remove duplicates
    sort($output);

    return $output;
}
票数 4
EN

Stack Overflow用户

发布于 2011-10-19 18:57:58

我不知道一个简单的内置方式,因为它并不是所有的东西,我怀疑有什么内置的东西。

你描述的方式听起来很合理。只需通过字符串进行一次迭代就可以做到这一点,但除非这是一个已知的性能问题,否则我不会费心处理它。

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

https://stackoverflow.com/questions/7826464

复制
相关文章

相似问题

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