如果3个相邻值匹配则返回键

时间:2014-09-23 06:10:33

标签: php arrays

我有以下数组

[true, false, false, true, true, false, false, true, true, true, false, false]

我知道如何获得中点并使用ceil()floor()来获取最接近的整数值以及如何检查此中点之前和之后的值是否与我的中点具有相同的值。

我的问题是,我需要三个true值才能让我的条件返回true。在此示例中,使用中点和与其相邻的值将返回false。中点是我在这里的首选位置,因为如果条件返回true,我需要在那里做点什么。然而,当这返回false时,我需要获得彼此相邻的三个true值的任何其他位置。我需要获取密钥,因为我需要密钥来确定中点,因为我需要在那里插入一个值。

所以从我的例子中,我需要返回密钥号7,8和9,而不是这些密钥的值

有任何建议可以实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

我不确定你是否想要这个。无论如何,请尝试以下代码

$a = array(true, false, false, true, true, false, false, true, true, true, false, false);
for ($i=0;$i<(sizeof($a)-1);$i++)
{
    if($i!=0&&$i!=(sizeof($a)-1))
    {
        if($a[$i-1]==$a[$i])
        {
            if($a[$i]==$a[$i+1])
            {
                echo ($i-1).','.$i.','.($i+1).'<br>';
            }
        }

    }
}

答案 1 :(得分:1)

将数组转换为包含“1”和“0”的字符串,然后搜索“111”:

$a = [true, false, false, true, true, false, false, true, true, true, false, false];

$b = array_map(function ($item) {
    return $item ? 1 : 0;
}, $a);

$joined = implode('', $b);
if (($pos = strpos($joined, '111')) !== false) {
    printf("Your positions are %d, %d and %d\n", $pos, $pos +1, $pos + 2);
} else {
    printf("Did not found 3 consecutive 'true'");
}