假设我有一个具有这种结构的数组
$array = Array(Array('a' => 'a', 'x' => $something));
变量$ something可以是这样的:1-3或1,3或1-3,2-5。我将变量$ array转换为:
案例1. $ something = 1-3
$array = Array(Array('a' => 'a', 'x' => Array(1,2,3)));
案例2. $ something = 1,3
$array = Array(Array('a' => 'a', 'x' => Array(1,3)));
案例3 .. $ something = 1-3,2-5
$array = Array(Array('a' => 'a', 'x' => Array(1,2,3,4,5)));
我尝试使用preg_match,但它不起作用。你能给我一些提示吗?
答案 0 :(得分:1)
您正在寻找explode来分割您的输入字符串,range以生成数组的内容,并array_merge来合并结果。
这样的工作:
<?php
$something = '1-3, 2-5';
$array = array(array('a' => 'a', 'x' => array()));
$result = array();
foreach (explode(', ', $something) as $input) {
$rangeParts = explode('-', $input);
$result = array_merge($result, range($rangeParts[0], $rangeParts[1]));
}
// contains duplicate entries because 1-3 and 2-5 overlap - use array_unique to remove duplicates or change input
$array[0]['x'] = $result;
在上一个作业中,您可以将$result
中的$something
换成1:1匹配您的示例或编辑输入({{1}})以正确反映范围函数的包容性/排他性规则。
答案 1 :(得分:0)
你有
$array = Array(Array('a' => 'a', 'x' => $something));
修改&#39; x&#39;的内容在这个数组里面。 (你不能修改$ something)。
$array[0]['x'] = Array(1,2,3);
或
$ array [0] [&#39; x&#39;] =数组(1,2,3,4,5);
答案 2 :(得分:0)
如果$ something中的值总是按照您的示例建议排序,则可以使用以下代码
$newomething = range(substr($something, 0, 1),substr($something, -1));
使用未排序的输入更新工作解决方案。 以下代码适用于
等输入 $something= '4,5,1-3,13,7-9';
$something = explode(',',$something);
$result= array();
foreach($something as $value)
{
if (strpos($value,'-') !== false)
{
$r = explode('-',$value);
$rad = range($r[0],$r[1]);
$result = array_merge($result,$rad);
}
else
{
array_push($result,$value);
}
}
sort($result);
答案 3 :(得分:0)
这是我的消化,我希望能为你效劳:
$something = "1,2,3,4";
$array = Array(Array('a' => 'a', 'x' => $something));
if(preg_match('/(\d+\-\d+(\,?))+/', $array[0]['x'], $m))
{
$x_values = Array();
$sets = explode(',', $m[0]);
foreach($sets as $set)
{
preg_match('/(\d+)\-(\d+)/', $set, $m);
$start = $m[1];
$end = $m[2];
for($i = $start; $i <= $end; $i++)
{
if(in_array($i, $x_values))
{
continue;
}
array_push($x_values, $i);
}
}
$array[0]['x'] = $x_values;
}
else if(preg_match('/(\d+)\-(\d+)/', $array[0]['x'], $m))
{
$x_values = Array();
$start = $m[1];
$end = $m[2];
for($i = $start; $i <= $end; $i++)
{
array_push($x_values, $i);
}
$array[0]['x'] = $x_values;
}
else if(preg_match('/\d+\,\d+/', $array[0]['x'], $m))
{
$x_values = explode(',', $array[0]['x']);
$array[0]['x'] = $x_values;
}