1

我制作了一个标记为“页码”的文本框。

用户可以按任何顺序输入页码,例如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. 对于每个值,验证它是一个数字还是由连字符分隔的两个数字
  3. 如果是单个数字,请将其添加到您的页码集中
  4. 如果它是一个范围,则用连字符分割字符串
  5. 确定哪个数字是较小的,for循环从较小的数字到较大的数字,每次将数字添加到集合中
  6. 对集合进行排序。

我将 set 设置为 assoc 数组,当我向其中添加数字时,我会将其设置为键。例如

$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 好,但这是我突然想到的,因为我不知道如何使用正则表达式(这也要求他们输入页面范围为 min-max 而不是 max-min,并且输入所有带有“,”的数字):

$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

您可以分解您的文本框值并对该数组进行排序,然后从该数组中找出具有范围的值并将该值推送到数组中(如果不存在)并再次对其进行排序。我想这会做到的。

于 2012-08-10T05:51:18.037 回答
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+匹配一个或多个。\d*匹配 0 个或更多,因此它只匹配一个-字符串。

于 2012-08-10T07:53:49.553 回答