2012-02-25 24 views
5

Có cách đơn giản để lấy danh sách các số có thể nằm trong khoảng từ 1 đến 15. Và đặt dấu gạch ngang thay cho số liên tiếp.Rút ngắn danh sách các số có dấu gạch nối giữa các số liên tiếp

Vì vậy mà ví dụ nếu bạn có số điện thoại sau:

1 2 3 5 6 7 10 12

Nó sẽ ra

1 - 3, 5 - 7, 10, 12

+2

Bạn đã thử gì? Bạn sẽ thấy bạn nhận được phản hồi tốt nhất nếu bạn đăng câu hỏi cụ thể (nghĩa là một số mã bạn đã thử và cách mã không hoạt động). – liquorvicar

Trả lời

7
<?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]); 
    } 
+0

Cảm ơn bạn rất nhiều, đã làm việc quyến rũ! – user1096685

5
$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; 
} 

Chức năng với nổ:

http://codepad.org/DKztLGhe

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>'); 
+0

+1 Tốt nhất so với trang được chấp nhận. –

+0

Xin chào, '$ lastindex' chắc chắn là cần thiết, hãy xem http://codepad.org/4fvWpL6d Vui lòng đặt lại :) – biziclop

+0

'Lỗi máy chủ nội bộ'. Không thể nhìn thấy liên kết, mặc dù tôi đã thử nghiệm nó tại địa phương và nó hoạt động. Trên mục cuối cùng, giá trị này sẽ trả về giá trị đúng '($ n + 1! = $ A [$ i + 1])'. Sẽ không có mục tiếp theo '$ a [$ i + 1]' –

Các vấn đề liên quan