是否有一個簡單的方法來獲取可能在1-15範圍內的數字列表。並且用短劃線代替連續數字。連續數字之間用連字符縮短數字列表
這樣,例如,如果你有以下數字:
1 2 3 5 6 7 10 12
它將輸出
1 - 3, 5 - 7, 10, 12
是否有一個簡單的方法來獲取可能在1-15範圍內的數字列表。並且用短劃線代替連續數字。連續數字之間用連字符縮短數字列表
這樣,例如,如果你有以下數字:
1 2 3 5 6 7 10 12
它將輸出
1 - 3, 5 - 7, 10, 12
<?php
$n = array (1, 2, 3, 5, 6, 7, 10, 12);
sort ($n); // If necessary.
$i = 0;
while ($i < count ($n))
{
if ($i != 0)
print (", ");
$rangestart = $i;
print ($n [$i++]);
while ($i < count ($n) && $n [$i] == $n [$i - 1] + 1)
$i++;
if ($i > $rangestart + 1)
print (" - " . $n [$i - 1]);
}
非常感謝你,做了一個魅力! – user1096685 2012-02-25 22:05:18
$n = array (1, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 16, 17);
$lastindex = count($n)-1;
foreach($n as $k => $i)
{
if($k == 0) echo $i;
elseif($i != $n[$k-1]+1) echo ', ' . $i;
elseif($k == $lastindex || $i+1 != $n[$k+1]) echo ' - ' . $i;
}
與爆炸功能:
function shorten($numbers){
$a = explode(' ',$numbers);
$lastindex = count($a)-1;
$s = '';
foreach($a as $i => $n){
if($i == 0) $s .= $n;
else if($a[$i-1]+1 != $n) $s .= ', '.$n;
else if($i == $lastindex || $n+1 != $a[$i+1]) $s .= ' - '.$n;
}
return $s;
}
print_r(shorten('').'<br>');
print_r(shorten('1').'<br>');
print_r(shorten('1 2').'<br>');
print_r(shorten('1 3').'<br>');
print_r(shorten('1 3 4 6').'<br>');
print_r(shorten('1 3 4 6 7').'<br>');
print_r(shorten('1 2 3 4 5').'<br>');
print_r(shorten('1 2 3 5 6 10 12 13').'<br>');
+1比接受的要好。 – 2012-02-25 23:34:02
嗨,'$ lastindex'絕對有必要,請參閱http://codepad.org/4fvWpL6d請把它放回:) – biziclop 2012-02-25 23:45:39
'內部服務器錯誤'。看不到鏈接,儘管我已經在本地進行了測試並且工作正常。在最後一個項目上,這將返回真實'($ n + 1!= $ a [$ i + 1])''。不會有下一個項目'$ a [$ i + 1]' – 2012-02-25 23:53:54
你嘗試過什麼?如果您發佈了特定的問題(例如,您嘗試過的某些代碼以及它無法正常工作),您會發現獲得最佳答案。 – liquorvicar 2012-02-25 21:16:33