我试着在这里和谷歌上搜索这个,所以如果我错过了一些明显的东西,我道歉。我可能根本不知道这些数字格式的名称。
我要做的是从一个字符串开始,比如“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”。很抱歉以前不清楚。
答案 0 :(得分:11)
不完全确定“扩展”是什么意思。无论如何,这是我如何使用explode
和range
:
$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)
上述例程运作良好,但有许多缺点:
我已更改代码以解决这些问题:
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
)