1

ユーザーがカンマ区切りの数字の文字列を貼り付けることができるテキストボックスがあり、それを配列に入れます。ただし、場合によっては、文字列にダッシュで区切られた数字が含まれている場合があり、そのダッシュが表示されている不足している数字を埋める必要があります。

例:

1, 4, 7, 20-25, 31, 46, 100

なる必要があります:

1, 4, 7, 20, 21, 22, 23, 24, 25, 31, 46, 100

どうすればこれを行うことができますか?ギャップは常に 5 つの数字になるとは限らず、入力される文字列に破線の数字のセットが複数存在する可能性があります。

4

5 に答える 5

2

正規表現なしの1つの方法を次に示します。

それは:

  1. で入力文字列を解析str_getcsv()して個々の要素に分割し、各要素の周りの空白をtrim()とでトリミングしますarray_map()
  2. 各要素を繰り返し、ダッシュを検索します。ダッシュが見つかった場合は、数値の範囲が見つかったので、ダッシュで ing を使用して開始インデックスと終了インデックスに分割し、 と を使用explode()して正しい範囲を形成$start$endますrange()。次に、その新しく形成された範囲を、 を使用した結果としてすでに形成されているものとマージしarray_merge()ます。
  3. 反復中にダッシュが見つからなかった場合は、リテラルの数値があると見なされ、その数値だけが結果の配列に追加されます。

それでおしまい!

$input = '1, 4, 7, 20-25, 31, 46, 100';
$entries = array_map( 'trim', str_getcsv( $input));

$result = array();
foreach( $entries as $entry) {
    if( strpos( $entry, '-') !== false) {
        list( $start, $end) = explode( '-', $entry);
        $result = array_merge( $result, range( trim($start), trim($end)));
    } else {
        $result[] = $entry;
    }
}

このデモから、次のものが生成されることがわかります。

Array (
    [0] => 1
    [1] => 4
    [2] => 7
    [3] => 20
    [4] => 21
    [5] => 22
    [6] => 23
    [7] => 24
    [8] => 25
    [9] => 31
    [10] => 46
    [11] => 100 )

編集:implode()結果の文字列を形成するには、配列の代わりに、次のように を呼び出すだけです。

echo implode( ', ', $result);

これにより、次が生成されます。

1, 4, 7, 20, 21, 22, 23, 24, 25, 31, 46, 100
于 2013-09-11T19:06:39.047 に答える
0

これは、正規表現を使用せずに実行できます。

  • ユーザー入力を取得し,、区切り文字として爆発すると、すべての数値の配列が得られます。
  • 次に、ステートメントを使用してif、文字列にダッシュが含まれているかどうかを確認します。
  • その場合はexplode、 delimiter を使用して再度-. これで2つの数字が得られます
  • range()その範囲内の数値の配列を作成するために使用します
  • implode()コンマで結合するために使用します。

便利な機能として:

コード:

function fill_string_gaps($input) 
{
    $parts = explode(',', $input);
    $resultArray = array();

    foreach ($parts as $part) {
        if(strpos(trim($part), '-')) {
            list($num1, $num2) = explode('-', $part);
            $expanded_num_array = range($num1, $num2);
            $resultArray = array_merge($resultArray, $expanded_num_array);
        } else {
            $resultArray[] = trim($part);
        }        
    }
        $comma_separated = implode(', ', $resultArray);
        return $comma_separated;

}

使用法:

$input = '1, 4, 7, 20-25, 31, 46, 100';
echo fill_string_gaps($input;)

テストケース:

echo fill_string_gaps('1-5');
echo fill_string_gaps('1-5, 12, 24');
echo fill_string_gaps('2, 2, 4, 5-8');

出力:

1, 2, 3, 4, 5
1, 2, 3, 4, 5, 12, 24
2, 2, 4, 5, 6, 7, 8

実際に見てください!

于 2013-09-11T19:04:18.827 に答える
0
$data = '1, 4, 7, 20-25, 31, 46, 100';
$elts = explode(',', $data);
$res = array();

foreach ($elts as $elt) {
    $elt = trim($elt);

    if (preg_match('/(\d+)-(\d+)/', $elt, $matches) === 1) {
        $res = array_merge($res, range($matches[1], $matches[2]));
    } else {
        $res[] = intval($elt);
    }
}

var_dump($res);
于 2013-09-11T19:04:54.983 に答える
0

私の解決策:DEMO HERE

  • 最初に使用してスペースを削除しますstr_replace()
  • explode(),整数の配列に使用する文字列。
  • explode()-範囲か単一の整数かをチェックするために使用するすべての要素。
  • の場合は、またはをrange使用してループし、に追加します。そうでない場合は、要素を に追加します。for()range()$i$newArray$newArray
  • implode()結果を使用,して印刷します。

PHP コード:

<?php
       $str=str_replace(' ', '', '1, 4, 7, 20-25, 31, 46, 100');
       $arr = explode(',',$str);
        foreach($arr as $elem){
           $values=explode('-',$elem);
          if(count($values)!=1)  for($i=$values[0];$i<=$values[1];$i++)   $newArr[]=$i;
          else $newArr[]=$elem;
        }
       echo implode(',',$newArr);
?>

出力:

1,4,7,20,21,22,23,24,25,31,46,100
于 2013-09-11T19:31:16.103 に答える