php 数组 如何将 1,2,4,5,6,7,9,11 优雅的转换为 ‘1,2,4-7,9,11’ 这样的字符串呢?

如题

php 数组

[1,2,4,5,6,7,9,11]


[7,11,16,17,18,33,102,103,555]

优雅的转换为

'1,2,4-7,9,11' 
'7,11,16-18,33,102-103,555'

这样的字符串呢?

谢谢你的回答.

如果是要把连续的数字拼起来,可以直接用个array_reduce计算结果再用implode拼接成字符串。

function array_hyphens($arr){
    return implode(',',array_reduce($arr,function($a,$num){
        if(!($len=count($a))) return array($num);
        @list($s,$e) =explode('-',$a[--$len]);
        if($s==$num-1 || (isset($e) && $e==$num-1)) $a[$len]=implode('-',array($s,$num));
        else array_push($a,$num);
        return $a;
    },array()));
}
echo array_hyphens([7,11,16,17,18,33,102,103,555]);
// 7,11,16-18,33,102-103,555

不过我看不懂你的规律,你第一个例子里1和2没有连起来,第二个例子102和103连起来了,是失误还是你有特殊需求?

  $a1=array(1,2,3,5,6,10,15,28,89,90,91,92,93);
  
      $count=count($a1);

      foreach ($a1 as $key => $value) {
        
        if(empty($a2)){
            $a2['min']=$value;
            $a2['max']=$value;
          

        }else{

           
            if(($value-$a2['max']==1)&&($key<>$count-1)){
                 $a2['max']=$value;

            }else{
                  if($a2['min']==$a2['max']){
                       $a3[]=$a2['min'];
                    
                  }else{
                       $a3[]=$a2['min'].'-'.$a2['max'];

                  }
               
                  $a2['min']=$value;
                  $a2['max']=$value;


            }


          }


        }
echo '<pre>';var_dump($a3);
  • 这段 python 想改写成 PHP,怎么破?求解
  • 用户提交订单,30分钟后没付款取消订单功能分析
  • PHP foreach array return 正则式的问题
  • Mysql条目限制
  • 如何迁移到七牛
  • thinkphp url_model 和session的问题
  • cpu性能测试
  • PHP动态调用,大家都来谈吧
  • 微信里面打开网站是调用的什么浏览器以及内核??
  • thinkphp base64图片多图上传
  • php捕获parse error 失败?