查找在php中输入的总页数

时间:2012-08-10 05:44:02

标签: php arrays cakephp

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

用户可以按1, 3, 6之类的任何顺序输入页码。

如果用户输入1, 4, 2, 6-8, 10,我想处理。然后我应该知道用户选择了页码1, 2, 4, 6, 7, 8, 10

这意味着用户还可以输入范围以及逗号分隔的数字,就像我们在打印文档时给出页码一样。

订单页数也可以更改。对于例如5, 6, 4-8, 1。这些数字可以重复,但我只需要唯一的页码。

我如何在PHP中完成它?在此先感谢。

4 个答案:

答案 0 :(得分:3)

这是攻击计划:

  1. 用逗号分隔字符串并遍历值
  2. 对于每个值,验证它是由连字符分隔的数字或两个数字
  3. 如果是单个号码,请将其添加到您的页码集
  4. 如果是一个范围,则用连字符
  5. 分割字符串
  6. 确定哪个数字较小,循环从较小的数字到较大的数字,每次都将数字添加到集合中
  7. 对集合进行排序。
  8. 我将set设置为一个关联数组,当我向其添加一个数字时,我将其设置为关键字。 E.g。

    $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);
    

答案 1 :(得分: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);

答案 2 :(得分:0)

您可以展开文本框值并对该数组进行排序,然后从该数组中查找带有范围的值,并在数组中推送该值(如果不存在)并再次对其进行排序。我认为这样做了。

答案 3 :(得分: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或更多,因此它只匹配-字符串。