查找符合条件的子集并返回紧随其后的值

Find qualifying subsets and return value that immediately follows

提问人:Vitor Brussi 提问时间:8/3/2022 最后编辑:mickmackusaVitor Brussi 更新时间:8/4/2022 访问量:35

问:

有人可以帮我一个函数来比较另一个数组中是否有数组,并在每次找到这个数组时返回下一个项目吗?

例如

$array1 = [0,0,0,1,1,0,1,1,0,0,1,1,0,0,1];
$array2 = [1,1,0];

在这种情况下,元素的确切序列被找到 3 次。$array2

序列后面的值为:

  • 第一个组合 =1
  • 第 2 种组合 =0
  • 第 3 个组合 =0

可视化:
标记序列匹配,标记应返回的值。
|---|^

0,0,0,1,1,0,1,1,0,0,1,1,0,0,1
      |---| ^
            |---| ^
                    |---| ^
PHP 数组 比较 子集

评论


答:

1赞 mickmackusa 8/3/2022 #1

我认为将数据读取为字符串比以当前数组形式迭代元素更简单。

只需使用后溯模式并匹配下一个出现的整数即可。

代码:(演示)(技术上更好的准确性)

$haystack = [0,0,0,1,1,0,1,1,0,0,1,1,0,0,1];
$needle = [1,1,0];

$regex = sprintf(
    '/(?<=%s,)\d+/',
    implode(',', $needle)
);

var_export(
    preg_match_all($regex, implode(',', $haystack), $m)
    ? $m[0]
    : []
);

输出:

array (
  0 => '1',
  1 => '0',
  2 => '0',
)

或者以数组形式处理数据的方法,可以进行迭代调用以获得相同的结果。(演示array_slice())

$needleCount = count($needle);
$result = [];
foreach ($haystack as $i => $straw) {
    $start = $i - $needleCount;
    if (
        $start >= 0
        && $needle === array_slice($haystack, $start, $needleCount)
    ) {
        $result[] = $straw;
    }
}