PHP转换字符串
假设我有一个具有这种结构的数组PHP转换字符串,php,arrays,string,Php,Arrays,String,假设我有一个具有这种结构的数组 $array = Array(Array('a' => 'a', 'x' => $something)); 变量$something可以是这样的:1-3或1,3或1-3,2-5。I如何转换变量$array: 案例1$某物=1-3 $array = Array(Array('a' => 'a', 'x' => Array(1,2,3))); 案例2$某物=1,3 $array = Array(Array('a' => 'a', 'x
$array = Array(Array('a' => 'a', 'x' => $something));
变量$something可以是这样的:1-3或1,3或1-3,2-5。I如何转换变量$array:
案例1$某物=1-3
$array = Array(Array('a' => 'a', 'x' => Array(1,2,3)));
案例2$某物=1,3
$array = Array(Array('a' => 'a', 'x' => Array(1,3)));
案例3$某物=1-3,2-5
$array = Array(Array('a' => 'a', 'x' => Array(1,2,3,4,5)));
我试着使用preg_match,但它不起作用。你能给我个提示,让我用别的吗?你有
$array = Array(Array('a' => 'a', 'x' => $something));
修改此数组中“x”的内容。(您不需要修改$something)
或
$array[0]['x']=数组(1,2,3,4,5) 您正在寻找拆分输入字符串、生成数组及其内容并合并结果的方法
类似这样的工作原理:
<?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;
如果$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);
这是我的建议,我希望为你工作:
$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;
}
$something=“1,2,3,4”;
$array=array(数组('a'=>'a','x'=>$something));
if(preg_匹配('/(\d+\-\d+(\,?)+/'),$array[0]['x'],$m))
{
$x_值=数组();
$sets=分解(“,”,$m[0]);
foreach($set为$set)
{
预匹配(“/(\d+)\-(\d+)/”,$set,$m);
$start=$m[1];
$end=$m[2];
对于($i=$start;$i),我真的怀疑上面的代码是否会产生所需的结果。检查php手册中的explode函数(第一个参数是分隔符)。他的想法不起作用,但至少我有了一个开始。对于$something='1,3'的情况,它不起作用。我已经更新了示例并用示例输入验证了它。“1,3”是一种新的输入格式,您应该首先描述它。如果您的意思是“1-3”,有效。@geoandri:updated-内爆/分解的参数顺序总是很有趣的。您的代码正在运行,我第一次尝试了类似的方法,但我认为对于这个简单的问题可能是另一个解决方案。此代码不适用于$something='1,3',因为它是生成数组(1,2,3),结果必须是数组(1,3)
$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;
}