Php 在连续数字之间使用连字符缩短数字列表

Php 在连续数字之间使用连字符缩短数字列表,php,arrays,algorithm,Php,Arrays,Algorithm,有没有一个简单的方法来获取一个范围在1到15之间的数字列表。用破折号代替连续的数字 例如,如果您有以下数字: 123567102 它将输出 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 (", "); $rangest

有没有一个简单的方法来获取一个范围在1到15之间的数字列表。用破折号代替连续的数字

例如,如果您有以下数字:

123567102

它将输出

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]);
  }
带有explode:

函数缩短($number){
$a=爆炸(“”,$number);
$lastindex=计数($a)-1;
$s='';
foreach($a为$i=>$n){
如果($i==0)$s.=$n;
如果($a[$i-1]+1!=$n)$s.=','.$n;
如果($i==$lastindex | |$n+1!=$a[$i+1])$s.='-'.$n;
}
返回$s;
}
打印(缩短(“”)。
; 打印(缩短('1')。
); 打印(缩短('12')。
); 打印(缩短('13')。
); 打印(缩短('1 3 4 6')。
'); 打印(缩短('1 3 4 6 7')。
); 打印(缩短('12345')。
); 打印(缩短('12355610113')。

您尝试过什么?如果您发布特定的问题(例如,您尝试过的一些代码以及它如何工作),您会发现您会得到最好的回答。您好,
$lastindex
是绝对必要的,请参阅将其放回:)“内部服务器错误”。看不到链接,尽管我已经在本地进行了测试,并且效果良好。在最后一项上,它将返回true
($n+1!=$a[$i+1])
。将不会有下一项
$a[$i+1]
在脚本前添加
错误报告(-1)
,您将收到关于不存在数组索引的通知。
$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>');