1

「 Page Numbers 」というラベルの付いたテキストボックスを作成しました。

ユーザーは、 のように任意の順序でページ番号を入力できます1, 3, 6

ユーザーが入力した場合、それを処理したい1, 4, 2, 6-8, 10。次に、ユーザーがページ番号を選択したことを知る必要があります1, 2, 4, 6, 7, 8, 10

つまり、ユーザーは、ドキュメントの印刷中にページ番号を指定するのと同じように、範囲とカンマ区切りの番号を入力することもできます。

ページ順も変更可能です。例えば5, 6, 4-8, 1。番号は繰り返すことができますが、一意のページ番号のみが必要です。

どうすればPHPでそれを行うことができますか? 前もって感謝します。

4

4 に答える 4

3

攻撃の計画は次のとおりです。

  1. 文字列をコンマで分割し、値を繰り返し処理します
  2. 値ごとに、ハイフンで区切られた1つまたは2つの数値であることを検証します
  3. 単一の番号の場合は、ページ番号セットに追加します
  4. 範囲の場合は、文字列をハイフンで分割します
  5. セットに番号を追加するたびに、小さい番号と小さい番号から大きい番号へのforループの番号を決定します。
  6. セットを並べ替えます。

セットを連想配列にし、それに番号を追加するときに、それをキーとして設定します。例えば

$pageNumbers[$number] = true;

コードは次のとおりです。

$pageNumberStr = $_REQUEST['pageNumberStr'];

$components = explode(",", $pageNumberStr);

$pageNumbers = array();

foreach ($components as $component) {
   $component = trim($component);
   if (preg_match('/^\d+$/', $component)) {
      $pageNumbers[$component] = true;
   } else if (preg_match('/^(\d+)-(\d+)$/', $component, $matches)) {
      $first = min($matches[1], $matches[2]);
      $last = max($matches[1], $matches[2]);

      for ($i = $first; $i <= $last; $i++) {
         $pageNumbers[$i] = true;
      }
   }
}

$pageNumbers = array_keys($pageNumbers);
sort($pageNumbers);
于 2012-08-10T05:54:59.200 に答える
2

私の答えはemuranosほど素晴らしいとは思いませんが、正規表現の使い方がわからないので、ここに私が作り上げたものがあります(これには、ページ範囲をmax-minではなくmin-maxとして入力する必要があります。すべての数字を「,」で区切って入力するには):

$answer = array();
$text = "1, 4, 2, 6-8, 10, 2-4, 9, 10";
$nums = explode(", ", $text);

foreach ($nums as $value)
{
    if (strpos($value, "-") == false)
        if (!in_array($value, $answer)) array_push($answer, $value);
    else
    {
        $newVal = split("-", $value);
        for ($i = $newVal[0]; $i <= $newVal[1]; $i++)
            if (!in_array($i, $answer)) array_push($answer, $i);
    }
}

sort($answer);
于 2012-08-10T06:17:27.677 に答える
0

もう少しコンパクトなもの:

<?php
function parsePages($values) {
    foreach(explode(',', $values) as $val) {
        $val = trim($val);
        if (ctype_digit($val)) {
            $pages[] = $val;
        } elseif (preg_match('/^(\d+)-(\d+)$/', $val, $matches)) {
            $pages = array_merge($pages, range($matches[1], $matches[2]));
        }
    }
    return array_unique($pages);
}

\d+1 つ以上に一致します。\d*0 以上に一致するため、単なる-文字列に一致します。

于 2012-08-10T07:53:49.553 に答える
0

テキストボックスの値を分解してその配列をソートし、その配列から範囲のある値を見つけて、存在しない場合はその値を配列にプッシュして、再度ソートすることができます。これで出来たと思います。

于 2012-08-10T05:51:18.037 に答える