2010-06-28 30 views
2

我试图通过一组记录,所有这些记录都有一个“数字”属性。我试图检查是否有3个连续的记录,例如6,7和8.PHP循环检查一组数字是连续的

我想我几乎与下面的代码一样,尽管在最后阶段击中了墙 - 任何帮助将是伟大的!

$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 
    } 
} 

回答

1

如果他们只是要连续,存储最后一个$,并检查以确保当前$ == $持续+ 1

如果你正在寻找的是连续N号,使用相同的方法,除了还要保留一个有多少人满足该要求的计数器。

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 
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; 
} 
+0

嗨Eineki,条目是降序,你会如何修改你的代码以适应? – pauld78 2010-06-28 22:56:01

+0

@ pauld78只是将+符号还原为 - (我已经修改了函数来做到这一点) – Eineki 2010-06-28 23:02:24

-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,可以评估为false。如果您只需要查看它们是否存在,则可以用return true;替换return $i;。如果需要,您还可以轻松地使其返回实际元素。

编辑2:固定为实际上找到连续的数字。

+0

我相信'findConsecutive(array(1,5,9123));'失败。 – 2010-06-29 00:27:53

+0

@Frank Farmer它怎么会失败?它返回int(0),它是连续三个元素的第一个元素的索引。请注意,0!== false。 – 2010-06-29 07:03:30

+0

1 5和9123不连续。 – 2010-06-29 16:02:34

0

如果你不想混乱排序,选择连续的三个数字中的任何一个都应该给你: - 它要么与其他数字相邻(diff1 = 1,diff2 = -1) - 唯一相邻的数字(差异= + -1)应符合前面的说法。

测试第一个条件。如果失败了,为第二个测试并且在成功的情况下,你已经有了自己的安全感;否则该集合不符合。

似乎对我来说。希望能帮助到你。

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 
} 

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

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

您也可以在没有循环的情况下实现相同的结果。

+1

'isConsecutive([1,3,0,0])'现在返回什么? – miken32 2015-11-09 22:57:25

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); 
    } 
}