2014-04-11 75 views
0

我試圖找出數組中存在的數字的頁範圍。我確實試圖搜索谷歌,但我只發現無關的帖子/頁面。從數組數組中生成字符串範圍(1-10,13,16,17-25 ..等)的算法

我一直在努力的代碼是:

$numbers = array(1,3,2,4,5,6,7,8,9,11,10,15,14,13,12,16,17,18,19,20,22); 

function get_number_ranges($numbers) 
{ 
    $last = null; 
    foreach ($numbers as $number) { 
     if (is_null($last)) { 
      $string = $number; 
      $last = $number; 
     } elseif ($last + 1 != $number) { 
      $string .= '-' . $last . ', ' . $number; 
      $last = $number; 
     } else { 
      $last = $number; 
     } 
    } 

    if ($last == $number) { 
     $string .= '-' . $number; 
    } 

    return $string; 
} 

和產生

1-1, 3-3, 2-2, 4-9, 11-11, 10-10, 15-15, 14-14, 13-13, 12-12, 16-20, 22-22 

我不希望它顯示重複的號碼,所以我希望它看起來像這樣:

1, 3, 2, 4-9, 11, 10, 15, 14, 13, 12, 16-20, 22 

這是我可以代表頁面範圍時,存儲關於文檔的歷史。

我確定這對於some1來說是個不錯的選擇,任何幫助都會大受歡迎!

回答

1

基本上你需要記住每個範圍的第一個數字,當你來追加連字符和最後一個數字時,只有當最後一個數字不同時才這樣做。類似於(未經測試):

function get_number_ranges($numbers) 
{ 
    $last = null; 
    foreach ($numbers as $number) { 
     if (is_null($last)) { 
      $string = $number; 
      $last = $number; 
      $first = $number ;       //Remember first 
     } elseif ($last + 1 != $number) { 
      if ($first != $last)      //Only append if different 
       $string .= '-' . $last ; 
      $string .= ', ' . $number; 
      $last = $number; 
      $first = $number ;       //Remember first 
     } else { 
      $last = $number; 
     } 
    } 

    if ($last == $number && $last != $first) {   //Only if different 
     $string .= '-' . $number; 
    } 

    return $string; 
} 
+0

由於按預期工作:) – mic

1

添加變量以保存範圍的第一個數字。如果最後一個數字等於第一個數字,那麼它不是一個範圍,也不需要'-XX'。

$numbers = array(1,3,2,4,5,6,7,8,9,11,10,15,14,13,12,16,17,18,19,20,22); 

function get_number_ranges($numbers) 
{ 
    $last = null; 
    $firstFromRange = null; 
    foreach ($numbers as $number) { 
     if (is_null($last)) { 
      $string = $number; 
      $firstFromRange = $number; // new range begins, save the number 
     } elseif ($last + 1 != $number) { 
      if ($firstFromRange == $last) { // if the range is only one number, don't add '-' . $last 
       $string .= ', ' . $number; 
      } else { 
       $string .= '-' . $last . ', ' . $number; 
      } 
      $firstFromRange = $number; // new range begins, save the number 
     } 

     $last = $number; 
    } 

    if ($last == $number && $last != $firstFromRange) { 
     $string .= '-' . $number; 
    } 

    return $string; 
} 
+0

感謝這也是工作,我將不得不基準2級響應看看更快出來:) – mic

+0

應該沒有什麼區別,使用易於理解/閱讀的版本。 –

0

我認爲你在尋找這樣的事情

<?php 
$numbers = array(1,3,2,4,5,6,7,8,9,11,10,15,14,13,12,16,17,18,19,20,22); 

function get_number_ranges($numbers){ 
    $result = ''; 
    if(is_array($numbers)){ 
     $start = $end = array_shift($numbers); 
     for($i=0,$c=count($numbers);$i<$c;$i++){ 
      if($end == $numbers[$i]-1){ 
       $end = $numbers[$i]; 
      }else{ 
       $result .= ($start == $end) ? $start: $start.'-'.$end; 
       $result .= ','; 
       $start = $end = $numbers[$i]; 
      } 
     } 
     $result .= ($start == $end) ? $start: $start.'-'.$end; 
    } 

    return $result; 
} 

echo get_number_ranges($numbers); 

見鍵盤結果http://codepad.org/l1JUSVJO

相關問題