2010-12-23 19 views
6


我有一個這樣的陣列:逆向在PHP陣列範圍樣功能

array(0, 2, 4, 5, 6, 7, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99); 

和我想獲得它作爲以下字符串:

0, 2, 4-7, 90+

任何示例在我開始從頭上拉頭髮之前,那裏有嗎?
謝謝。

UPDATE:
這是我服用@安迪的代碼,並修改了一點之後使用的最終解決方案。

function rangeArrayToString($rangeArray, $max = 99) { 
    sort($rangeArray); 
    $first = $last = null; 
    $output = array(); 

    foreach ($rangeArray as $item) { 
     if ($first === null) { 
      $first = $last = $item; 
     } else if ($last < $item - 1) { 
      $output[] = $first == $last ? $first : $first . '-' . $last; 
      $first = $last = $item; 
     } else { 
      $last = $item; 
     } 
    } 

    $finalAddition = $first; 

    if ($first != $last) { 
     if ($last == $max) { 
      $finalAddition .= '+'; 
     } else { 
      $finalAddition .= '-' . $last; 
     } 
    } 

    $output[] = $finalAddition; 

    $output = implode(', ', $output); 
    return $output; 
} 
+1

Erm ...也許你應該嘗試使用一些*編程*來解決這個問題?我並不想冒犯你,但如果你稍微使用你的大腦,這是一項簡單的任務。 – 2010-12-23 14:29:43

+3

我真的不明白,在用戶提出問題的網站中,仍然有人像你剛纔那樣評論評論。 如果你認爲這不是一件容易的事,你不必回答這個問題,但告訴我,我可以嘗試通過編程來做到這一點,根本沒有任何幫助。我喜歡看代碼示例。它通過不堅持範式來豐富我的編碼實踐。 – Doron 2010-12-23 14:38:09

回答

11
$first = $last = null; 
$output = array(); 

foreach ($array as $item) { 
    if ($first === null) { 
     $first = $last = $item; 
    } else if ($last < $item - 1) { 
     $output[] = $first == $last ? $first : $first . '-' . $last; 
     $first = $last = $item; 
    } else { 
     $last = $item; 
    } 
} 

$output[] = $first == $last ? $first : $first . '+'; 
$output = join(', ', $output); 
0
function makeRange($array, $last=array(), $done=array()){ 
    if ($array == array()) { 
     return $done; 
    } 

    $h = $array[0]; 
    $t = array_slice($array, 1); 

    if ($last == array()) { 
     $last = array($array[0], $array[0]); 
    } 
    if ($t[0] == 1 + $last[1]) { 
     return makeRange($t, array($last[0], $h+1), $done); 
    } 
    $done[] = $last; 
    return makeRange($t, array(), $done); 
} 

print_r(makeRange(array(1,2,3,5,6,7, 9, 11,12,13,18))); 

// Output 

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 3 
     ) 

    [1] => Array 
     (
      [0] => 5 
      [1] => 7 
     ) 

    [2] => Array 
     (
      [0] => 9 
      [1] => 9 
     ) 

    [3] => Array 
     (
      [0] => 11 
      [1] => 13 
     ) 

    [4] => Array 
     (
      [0] => 18 
      [1] => 18 
     ) 

) 

,你可以添加一個簡單的裝飾,提供所需4-7代替陣列(4,7)。因爲數據的觀點應該是分開的,所以我忽略了這一點。

希望有所幫助。