我正在尝试遍历一组记录,所有记录都具有“数字”属性。我试图检查是否有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
}
}
答案 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:已修复实际上找到连续的数字。