Php字符串与分隔符到页面列表

时间:2015-10-08 15:54:18

标签: php

我尝试重新创建我们在办公室或土坯上打印页面时看到的内容。

例如,当您要打印第1页到第5页时,您会写:1-5,如果您想在外面打印一页,请写下:1-5,8

目前我用''' : 1-5 / 8

然后通过' - '爆炸每个结果。如果我有结果,我会从第一页循环到最后一页并用逗号创建变量:

1,2,3,4,5,8

最后我爆发了','并使用数组唯一来擦除双值。

要实现这一目标需要一些时间,特别是当有很多' - '。

也许某人有更简单的解决方案呢?

感谢

编辑:

$pages = "1-4,6-8,14,16,18-20";
$pages_explode = explode(',',$pages);

foreach($pages_explode as $page){

$page_explode = explode('-',$page);

if(!empty($page_explode[1])){

for ($i=$page_explode[0]; $i<=$page_explode[1] ; $i++) {

$page_final .= $i.',';

}

}else{

$page_final .= $page_explode[0].',';

}

}

$page_final = explode(',',$page_final);
$page_final = array_unique ($page_final);

foreach($page_final as $value){

echo $value.'<br>';

}

2 个答案:

答案 0 :(得分:1)

这是代码高尔夫挑战吗?

基本方法对我来说似乎很好:

$input = '1-5,6-12,8';
$patterns = explode(',', $input);

$pages = [];
foreach ($patterns as $pattern) {
    if (2 == count($range = explode('-', $pattern))) {
        $pages = array_merge($pages, range($range[0], $range[1]));
    } else {
        $pages[] = (int)$pattern;
    }
}
$uniquePages = array_unique($pages);

var_dump($uniquePages);

输出:

array (size=12)
  0 => int 1
  1 => int 2
  2 => int 3
  3 => int 4
  4 => int 5
  5 => int 6
  6 => int 7
  7 => int 8
  8 => int 9
  9 => int 10
  10 => int 11
  11 => int 12

答案 1 :(得分:1)

必须删除重复项表明您的字符串中有重叠的范围。

例如:1-5,2-9,7-15,8,10

您似乎在不考虑重叠区域的情况下处理所有这些,并最终尝试通过昂贵的array_unique函数删除重复项。

您的代码应该记住结果范围的最小值和最大值,而不处理与此范围重叠的任何内容。

以下是演示该想法的示例代码。但它肯定比您在问题中建议的代码更快。您应该在那里添加部件以处理您需求中的其他类型的分隔符(如果有)。

<?php

$ranges = "1-5,3-7,6-10,8,11";  

$min = 10000;
$max = -1;    
$numbers = array();     //Your numbers go here


//Just a utility function to generate numbers from any range and update margins
function generateNumbers($minVal, $maxVal) {
    global $min, $max, $numbers;

    for ($i = $minVal; $i <= $maxVal; $i++) {
        array_push($numbers, $i);

        if ($i < $min)
            $min = $i;

        if ($i > $max)
            $max = $i;
    }


}    


//Seperate ranges
$sets = explode(",", $ranges);

//Go through each range
foreach($sets as $aSet) {

    //Extract the range or get individual numbers
    $range = explode("-", $aSet);   

    if (count($range) == 1)  { //its an individual number. So check margins and insert

        $aSet = intval($aSet);

        if ($aSet < $min){ 
            array_push($numbers, $aSet);
            $min = $aSet;
        }       

        if ($aSet > $max){ 
            array_push($numbers, $aSet);
            $max = $aSet;
        }       

        continue;       // <----- For single numbers it ends here
    }       


    //Its a range
    $rangeLow = intval($range[0]);
    $rangeHigh = intval($range[1]);


    //Adjusting numbers to omit cases when ranges fall right on the margins
    if ($rangeLow == $min){
        $rangeLow++;
    }
    else
        if ($rangeLow == $max) {
        $rangeLow--;
    }

    if ($rangeHigh == $min){
        $rangeHigh++;
    }
    else
        if ($rangeHigh == $max) {
        $rangeHigh--;
    }   



    //Check if below or above the generated range
    if (($rangeLow < $min && $rangeHigh < $min) || ($rangeLow > $max && $rangeHigh > $max)) {
        generateNumbers($rangeLow, $rangeHigh);
    };


    //Check if across the lower edge of the generated range
    if ($rangeLow < $min && $rangeHigh > $min && $rangeHigh < $max) {
        generateNumbers($rangeLow, $min - 1);
    };


    //Check if across the upper edge of the generated range
    if ($rangeLow > $min && $rangeLow < $max && $rangeHigh > $max) {
        generateNumbers($max + 1, $rangeHigh);
    };  

}


//Now just sort the array

print_r($numbers);

?>