0

我有一个相当奇怪的问题。我有一个应用程序,它需要一组介于 1 和 6 之间的数字。它们可以是任意数量的模式。从那里,我希望它们以特定的方式格式化。这有点难以解释,所以我只给你一些例子:

[1] -> "1" (duh!)
[1, 3] -> "1,3" (any two values will be separated by commas)
[1, 2, 3] -> "1-3" (consecutive series: lowest and highest values separated by a dash)
[1, 3, 4] -> "1, 3, 4" (non-consecutive series: separated by commas)
[1, 2, 3, 5, 6] -> 1-3, 5, 6" (mixed: consecutive series and non-consecutive series as you see)

其他几个参数:

  • 数组中的每一项都是唯一的
  • 该列表将被预先排序

该应用程序是用 PHP 编写的。任何帮助将不胜感激。

4

3 回答 3

1

这是一个功能,可以满足您的需求,并使用您的示例对其进行了测试。

PS:这是带有测试的键盘: http: //codepad.org/hz9cHOvr#output

function getString($arr, $range = 1)
{
    if (!is_array($arr)) {
        return '';
    }

    // reset array keys
    $arr = array_values($arr);

    // simple cases
    if (count($arr) <= 2) {
        return implode(',', $arr);
    }

    $len = count($arr);
    $rez = '';

    for ($i = 0; $i < $len; $i ++) {
        $rangeLength = 1;
        $nextI = $i;
        $stop = 0;
        while (!$stop) { // loop to see if we find a range
            if ($arr[$nextI + 1] - $arr[$nextI] == $range) {
                $nextI ++;
                $rangeLength ++;
                $stop = 0;
            } else {
                $stop = 1;
            }
        }
        if ($rangeLength >= 3) { // either add the range
            $rez .= $arr[$i] . '-' . $arr[$nextI] . ', ';
            $i = $nextI;
        } else { // or the number
            $rez .= $arr[$i] . ', ';
        }
    }
    return substr($rez, 0, strlen($rez) - 2); // strip last 2 chars (the comma and space)
 }
于 2013-02-26T07:29:14.407 回答
1

由于突然的 Internet 错误而延迟...

function compound(array $arr)
{
    $cache=array();
    $rst="";
    foreach($arr as $v)
    {
        if(empty($cache) || $v==end($cache)+1)
        {
            $cache[]=$v;
        }
        else
        {
            if(!empty($rst)) $rst.=",";
            if(count($cache)>2) $rst.=reset($cache)."-".end($cache);
            else $rst.=implode(",",$cache);
            $cache=array($v);
        }
    }
    if(!empty($rst)) $rst.=",";
    if(count($cache)>2) $rst.=reset($cache)."-".end($cache);
    else $rst.=implode(",",$cache);
    return $rst;
}
echo compound(array(1,2,3,5,6))."\n"; // gets "1-3,5,6"
echo compound(array(1,3,4,5,6)); // gets "1,3-6"

现场演示

于 2013-02-26T08:54:29.443 回答
1

试试这个解决方案:

$array    = array(1,3,5,6);

function checkConsec($d) {
    for($i=0;$i<count($d);$i++) {
        if(isset($d[$i+1]) && $d[$i]+1 != $d[$i+1]) {
            return false;
        }
    }
    return true;
}

$temp     = array();
$res      = array();
for($i=0;$i<count($array);$i++){
    $temp[]  = $array[$i];
    if(checkConsec($temp) && count($temp) > 1){
       $res[$temp[0]] = $temp[0]."-".$temp[count($temp)-1];
    }else{
       $res[$array[$i]] = $array[$i];
       $temp     = array();
       $temp[]  = $array[$i];
    }
}

echo implode(",",$res);

对于给定的输入 ( array(1,3,5,6)) 输出将是1,3,5-6

于 2013-02-26T07:36:11.753 回答