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

この解決策を試してください:

$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 に答える
1

突然のインターネットエラーにより遅延...

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 に答える