我制作了一个标记为“页码”的文本框。
用户可以按任何顺序输入页码,例如1, 3, 6
.
如果用户输入1, 4, 2, 6-8, 10
. 然后我应该知道用户选择的页码1, 2, 4, 6, 7, 8, 10
。
这意味着用户还可以输入范围以及逗号分隔的数字,就像我们在打印文档时给出页码一样。
页的顺序号也可以更改。例如5, 6, 4-8, 1
。这些数字可以重复,但我只需要唯一的页码。
我如何在 PHP 中做到这一点?提前致谢。
进攻计划如下:
我将 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);
我认为我的答案不如 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);
您可以分解您的文本框值并对该数组进行排序,然后从该数组中找出具有范围的值并将该值推送到数组中(如果不存在)并再次对其进行排序。我想这会做到的。
更紧凑的东西:
<?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 个或更多,因此它只匹配一个-
字符串。