PHP转换字符串

时间:2014-10-16 09:41:46

标签: php arrays string

假设我有一个具有这种结构的数组

$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,但它不起作用。你能给我一些提示吗?

4 个答案:

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