我试着在这里和谷歌上搜索这个,所以如果我错过了一些明显的东西,我很抱歉。我可能根本不知道这些数字的格式名称。
我想要做的是从一个字符串开始,比如"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“。抱歉之前没说清楚。
发布于 2011-10-19 18:58:23
不太清楚你所说的“扩张”是什么意思。不管怎样,我会用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));发布于 2014-07-14 21:11:08
上面的例程运行良好,但有一些缺点:
字符串中的
我修改了代码以解决以下问题:
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;
}发布于 2011-10-19 18:57:58
我不知道一个简单的内置方式,因为它并不是所有的东西,我怀疑有什么内置的东西。
你描述的方式听起来很合理。只需通过字符串进行一次迭代就可以做到这一点,但除非这是一个已知的性能问题,否则我不会费心处理它。
https://stackoverflow.com/questions/7826464
复制相似问题