PHP循环检查一组数字是否连续

时间:2010-06-28 22:11:30

标签: php

我正在尝试遍历一组记录,所有记录都具有“数字”属性。我试图检查是否有3个连续记录,例如6,7和8.

我想我差不多有下面的代码,虽然在最后阶段已经碰壁了 - 任何帮助都会很棒!

$nums = array();
while (count($nums <= 3))
{
    //run through entries (already in descending order by 'number'
    foreach ($entries as $e)
    {
        //ignore if the number is already in the array, as duplicate numbers may exist
        if (in_array($e->number, $num))
            continue;
        else
        {
            //store this number in the array
            $num[] = $e->number;
        }
    //here i need to somehow check that the numbers stored are consecutive
    }
}

9 个答案:

答案 0 :(得分:2)

function isConsecutive($array) {
    return ((int)max($array)-(int)min($array) == (count($array)-1));
}

你也可以在没有循环的情况下获得相同的结果。

答案 1 :(得分:1)

如果他们只需连续,请存储$ last,并检查以确保$ current == $ last + 1.

如果您正在寻找连续的n个数字,请使用相同的数字,除了保留一个满足该要求的数量的计数器。

答案 2 :(得分:1)

$arr = Array(1,2,3,4,5,6,7,343,6543,234,23432,100,101,102,103,200,201,202,203,204);

for($i=0;$i<sizeof($arr);$i++)
{ 
    if(isset($arr[$i+1]))
    if($arr[$i]+1==$arr[$i+1])
    {

        if(isset($arr[$i+2]))
        if($arr[$i]+2==$arr[$i+2]) 
        {

            if(isset($arr[$i+3]))       
            if($arr[$i]+3==$arr[$i+3])
            { 
                echo 'I found it:',$arr[$i],'|',$arr[$i+1],'|',$arr[$i+2],'|',$arr[$i+3],'<br>'; 
            }//if3

        }//if 2

    }//if 1
}

我没有彻底调查过,也许可以改进工作更快!

答案 3 :(得分:0)

以下示例可以检查任何大小的列表的此要求:

class MockNumber
{
    public $number;
    public function __construct($number)
    {
        $this->number = $number;
    }

    static public function IsListConsecutive(array $list)
    {
        $result = true;
        foreach($list as $n)
        {
            if (isset($n_minus_one) && $n->number !== $n_minus_one->number + 1)
            {
                $result = false;
                break;
            }

            $n_minus_one = $n;
        }

        return $result;
    }
}

$list_consecutive = array(
     new MockNumber(0)
    ,new MockNumber(1)
    ,new MockNumber(2)
    ,new MockNumber(3)
);

$list_not_consecutive = array(
     new MockNumber(5)
    ,new MockNumber(1)
    ,new MockNumber(3)
    ,new MockNumber(2)
);

printf("list_consecutive %s consecutive\n", MockNumber::IsListConsecutive($list_consecutive) ? 'is' : 'is not');
// output: list_consecutive is consecutive

printf("list_not_consecutive %s consecutive\n", MockNumber::IsListConsecutive($list_not_consecutive) ? 'is' : 'is not');
// output: list_not_consecutive is not consecutive

答案 4 :(得分:0)

我认为您需要类似以下功能的东西(不需要数组来存储数据)

<?php
function seqOfthree($entries) {
// entries has to be sorted descending on $e->number
  $sequence = 0;
  $lastNumber = 0;

  foreach($entries as $e) {
    if ($sequence==0 or ($e->number==$lastNumber-1)) {
      $sequence--;
    } else {
      $sequence=1;
    }
    $lastNumber = $e->number;
    if ($sequence ==3) {
      // if you need the array of sequence you can obtain it easy
      // return $records = range($lastNumber,$lastNumber+2);
      return true;
    }
  }
  // there isn't a sequence
  return false;
}

答案 5 :(得分:0)

如果你不想弄乱任何排序,选择连续的三个数字中的任何一个应该给你: - 它或者与其他数字相邻(diff1 = 1,diff2 = -1) - 唯一相邻的数字(diff = + -1)应符合之前的声明。

测试第一个条件。如果它失败了,那么测试第二个并且在成功的情况下,你已经得到了你的保证;否则该集合不符合。

似乎对我而言。希望它有所帮助。

答案 6 :(得分:0)

function isConsecutive($array, $total_consecutive = 3, $consecutive_count = 1, $offset = 0) {
    // if you run out of space, e.g. not enough array values left to full fill the required # of consecutive count
    if ( $offset + ($total_consecutive - $consecutive_count ) > count($array) ) {
        return false;
    }

    if ( $array[$offset] + 1 == $array[$offset + 1]) {
        $consecutive_count+=1;
        if ( $consecutive_count == $total_consecutive ) {
            return true;
        }
        return isConsecutive($array, $total_consecutive, $consecutive_count, $offset+=1 );
    } else {
        return isConsecutive($array, $total_consecutive, 1, $offset+=1 );
    }
}

答案 7 :(得分:0)

这将确认数组的所有项目是连续的向上还是向下。
如果需要指示,可以更新以返回[$ up,$ down]数组或其他值。

function areAllConsecutive($sequence)
{
    $up = true;
    $down = true;
    foreach($sequence as $key => $item)
    {
        if($key > 0){
            if(($item-1) != $prev) $up = false;
            if(($item+1) != $prev) $down = false;
        }
        $prev = $item;
    }

    return $up || $down;
}

// areAllConsecutive([3,4,5,6]); // true
// areAllConsecutive([3,5,6,7]); // false
// areAllConsecutive([12,11,10,9]); // true

答案 8 :(得分:-1)

以下函数将返回第一个连续元素的索引,如果不存在则返回false:

function findConsecutive(array $numbers)
{
    for ($i = 0, $max = count($numbers) - 2; $i < $max; ++$i)
        if ($numbers[$i] == $numbers[$i + 1] - 1 && $numbers[$i] == $numbers[$i + 2] - 2)
            return $i;
    return false;
}

编辑:这似乎引起了一些混乱。与strpos()类似,此函数返回元素的位置(如果存在)。该位置可以是0,可以评估为假。如果您只是需要查看它们是否存在,那么您可以将return $i;替换为return true;。如果需要,您还可以轻松地返回实际元素。

编辑2:已修复实际上找到连续的数字。