2015-10-08 3 views
2

Я пытаюсь воссоздать то, что мы видим, когда мы печатаем страницу в офисе или adobe.Php строка с разделителем на страницу списка

Например, если вы хотите распечатать страницу 1 до 5 Вы пишете: 1-5, и если вы хотите, чтобы напечатать страницу вне Вы пишете: 1-5,8

На данный момент я взрываюсь строкой, «»: 1-5/8

Затем взрываются каждый результат, „-“ и если я получил петлю результат I от первой до последней страницы и создать переменную с запятой:

1,2, 3,4,5,8

Наконец-то я взорвался ',' и использовал массив, уникальный для стирания do uble.

Для достижения этого требуется несколько раз, особенно когда есть много «-».

Возможно, у кого-то есть более легкое решение?

Спасибо

Edit:

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

} 
+0

Вы можете дать нам примерную строку с краткими «пожалуйста»? – Alfwed

+0

Почему бы вам не показать свой код – RiggsFolly

ответ

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 
+0

Работайте отлично :) Спасибо – Hydro

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

?> 
+0

Хорошо работает, пока я не попробую что-то вроде: '1-4,6-8,14,16,18-20,4-9' он не принимает уход 4-9 в конце – Hydro

+0

Я написал этот код, чтобы продемонстрировать идею для выбранного образца. Вы должны проанализировать его и заполнить пробелы, чтобы удовлетворить ваши потребности. –

Смежные вопросы