PHP:有没有一种简单的方法可以将数字列表(如字符串,如“1-3,5,7-9”)解析为数组?

时间:2011-10-19 18:47:42

标签: php arrays list methods numbers

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

我要做的是从一个字符串开始,比如“1-3,5,7-9”,然后把它变成一个带有以下条目的PHP数组:1,2,3,5, 7,8,9

我知道如何在逗号上使用preg_split,然后迭代并扩展任何标记,但我觉得必须有一个更容易/更好的方法。

修改

我没说清楚,但字符串需要包含SPANS!这意味着如果我的字符串是“1-9”,我的结果数组应该是“1,2,3,4,5,6,7,8,9”而不是“1,9”。很抱歉以前不清楚。

5 个答案:

答案 0 :(得分:11)

不完全确定“扩展”是什么意思。无论如何,这是我如何使用exploderange

$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,因为它可能会产生安全风险和其他问题。 我不会用它但它仍然可行。

话虽如此,这里是:

$output = explode(',', preg_replace('/([0-9]*)-([0-9]*)/e', 'implode(",", range($1, $2));', $input));

答案 1 :(得分:2)

上述例程运作良好,但有许多缺点:

  1. 字符串中的空格扰乱了例程
  2. 不删除重复项,例如5,4-7给出5,4,5,6,7
  3. 数字未分类。
  4. 我已更改代码以解决这些问题:

    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;
    }
    

答案 2 :(得分:1)

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

你描述的方式听起来像是一种合理的方法。只需在字符串中进行一次迭代就可以做到这一点,但除非它是一个已知的性能问题,否则我不会打扰它。

答案 3 :(得分:1)

$str = '1-3,5,7-9';
$arr = explode(',', $str);
$result = array();
foreach($arr as $a){
  $x = explode('-', $a);
  if(count($x) === 2){
    $x = range($x[0], $x[1]);
  }
  $result = array_merge($result, $x);
}
print_r($result);

不确定这是多么有效,但它完成了工作。

答案 4 :(得分:0)

离开这样做,我回来看已经有2个答案了。 :(

<?php
function arrex($s){
    $arr = explode("-", $s);
    $v=$arr[0] + 1;
    $val = array();
            while($v!=$arr[1]){
                 $val[$v] = $v;
                   $v++;
            }
    array_unshift($val, $arr[0]);
    array_push($val, $arr[1]);
return $val;
}
$s = "1-9";
print_r(arrex($s));
?>

输出

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
)
相关问题