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