<?php
$arr=array(1,2,3,4,6,7,9,10,11,12,13,15,45,46,47,66,67,90);
function sort_num($array)
{
$string="";
foreach ($array as $key => $value)
{
if ($key==0)
{
$string.=$value;
}
else
{
if ($value==$sec_value && $array[$key+1]==$thr_value && $once!="yes")
{
$string.="-";
$once="yes";
}
if ($value==$sec_value && $array[$key+1]!=$thr_value)
{
if ($once=="yes")
{
$string.=$value;
$once="no";
}
elseif ($once=="no")
{
$string.=",".$value;
}
}
elseif ($value!=$sec_value)
{
$string.=",".$value;
}
}
$sec_value=$value+1;
$thr_value=$sec_value+1;
}
return $string;
}
$str=sort_num($arr);
echo $str;
?>

解决方案 »

  1.   

    <?php
    /*
     * 前提就是$arr数组已经排序过
     */
    $arr=array(1,2,3,4,6,7,9,10,11,12,13,15);
    $str = "";
    $num = 0;
    foreach($arr as $val){
    if(empty($str)){
    $str = $val;
    }else {
    if($val != $num + 1){
    $str .= "-".$num.",".$val;
    }
    }
    $num = $val;
    }
    echo $str;/*
    output:1-4,6-7,9-13,15
    */
    ?>
      

  2.   

    其实我现在也有一个思路,不论数组长短,把数组全部使用逗号分隔,判断数组长度,小于2的直接返回,大于2的从正数第二个到倒数第二个遍历,如果前一个元素值为当前元素减一,并且后一个元素值为当前元素加一,记录当前元素的下标,存入数组,然后遍历新数组,把所有符合前边要求的元素用空值替换掉,这样连续的部分就是,,,这种形式了,使用preg_replace替换成-就是最后结果。