有一个一维数组要求取出$a中相连元素的组数,及每一组的元素.
如$a=array(5,6,7,12,15,16,20);
应该得到:
组数为:2;
每一组的元素为:第一组(5,6,7);第二组(15,16);

解决方案 »

  1.   

    $a=array(5,6,7,12,15,16,20);
    $arr = array();
    $j = 0;
    for($i=0;$i<count($a);$i++)
    {
    if($a[$i-1])
    {
    if($a[$i] - $a[$i-1] == 1)
    {
    if(!in_array($a[$i-1],(array)$arr[$j])) $arr[$j][] = $a[$i-1];
    $arr[$j][] = $a[$i];
    }
    else 
    {
    $j++;
    }
    }
    }
    print_r(array_values($arr));
      

  2.   

    傻了,改一下$a=array(5,6,7,12,15,16,20);
    $arr = array();
    $j = 0;
    for($i=1;$i<count($a);$i++)
    {if($a[$i] - $a[$i-1] == 1)
    {
    if(!in_array($a[$i-1],(array)$arr[$j])) $arr[$j][] = $a[$i-1];
    $arr[$j][] = $a[$i];
    }
    else
    {
    $j++;
    }
    }
    print_r(array_values($arr));
      

  3.   

    <?php
    $a=array(5,6,7,12,15,16,20);
    $begin = -1;
    $out = array();
    for ($n=0; $n < count($a); $n++) {
    if ($a[$n] !== $a[$n+1]-1) {
    if ($begin != -1 && ($n >= 1 || !isset($a[$n+1]))){
    $out[] = array_slice($a, $begin, max($n-$begin+1, -1));
    $begin = -1;
    }
    } else if ($begin == -1) {
    $begin = $n;
    }
    }
    print_r($out);
    ?>
      

  4.   

    <?php
    $a=array(5,6,7);
    $begin = -1;
    $out = array();
    for ($n=0; $n < count($a); $n++) {
    if ($a[$n] !== $a[$n+1]-1) {
    if ($begin != -1 && $n > 0 ){
    $out[] = array_slice($a, $begin, $n-$begin+1);
    $begin = -1;
    }
    } else if ($begin == -1) {
    $begin = $n;
    }
    }
    print_r($out);
    ?>
      

  5.   

    这个是最精简的了。。之前写的遗留了之前那个程序的部分残肢
    <?php
    $a=array(5,6,7,12,15,16,20);
    $begin = -1;
    $out = array();
    for ($n=0; $n < count($a); $n++) {
    if ($a[$n] !== $a[$n+1]-1) {
    if ($begin != -1) {
    $out[] = array_slice($a, $begin, $n-$begin+1);
    $begin = -1;
    }
    } else if ($begin == -1) {
    $begin = $n;
    }
    }
    print_r($out);
    ?>
      

  6.   

    $a = array(5,6,7,12,15,16,20);
    $t = array();
    foreach($a as $v) {
    if($v != $k) {
    if(count($t) > 1) {
    $o[] = $t;
    }
    $t = array();
    }
    $t[] = $v;
    $k = $v+1;
    }
    print_r($o);
      

  7.   

    游戏之作:)     (实际使用请参考楼上唠叨的)
    $a=array(5,6,7,12,15,16,20);
    $results=array();do{
        $c=array_intersect_assoc($a, range($a[0],$a[count($a)-1]) );
        if(count($c)>1) $results[]=$c;
        $a=array_values(array_diff($a,$c));
    }while( !empty($c) && !empty($a) );print_r($results);
      

  8.   

    唠叨老大的有BUG~~
    $a = array(5,6,7);
      

  9.   

    $a = array(5,6,7,12,15,16,20);
    $t = array();
    foreach($a as $v) {
      if($v != $k) {
        if(count($t) > 1) {
          $o[] = $t;
        }
        $t = array();
      }
      $t[] = $v;
      $k = $v+1;
    }/* 是的,要加上这段 */
    if(count($t) > 1) {
      $o[] = $t;
    }print_r($o);
      

  10.   

    呵呵,老大来了,我的继续修剪一下.
    ================================
    $a=array(5,6,7,12,15,16,20);
    $j = 0;
    for($i=1;$i<count($a);$i++)
    {
    if($a[$i] - $a[$i-1] == 1)
    {
    if($arr[$j] == '') $arr[$j][] = $a[$i-1];
    $arr[$j][] = $a[$i];
    }
    else $j = count($arr);
    }
    print_r($arr);
      

  11.   

    恩,老大说得对.
    再改改.
    ====================
    $a=array('t'=>5,6,'x'=>7,12,'y'=>15,16,5,20,21);
    $j = 0;
    foreach($a as $k=>$v)
    {
    $n = next($a);
    if( $n - $v == 1 )
    {
    $arr[$j] == '' ? $arr[$j][] = $v.'|'.'key is: "'.$k.'"' : ''; 
    $arr[$j][] = $n.'|'.'key is: "'.key($a).'"';
    }
    else $j = count($arr);
    }
    print_r($arr);