如何在PHP中检查一个数组是否连续包含另一个数组中的值?

3

我在项目中遇到了问题。以下是具体情况:

假设我有两个数组,array_1array_2array_1的值为['A', 'B', 'C', 'D', 'E', 'F'],而array_2的值为['B', 'C', 'D']。如果array_1的值与array_2的值连续相同,则结果为true。对于上述情况,结果为true。现在,如果array_2的值为['C', 'D', 'B'],则返回false,因为这些值不是连续的。以下是我尝试的代码:

    if (!array_diff($array_2, $array_1)) {
        return true;
    }
return false

但这并不返回我想要做的事情。提前感谢。

数组必须具有相同的长度,还是可以比较一个数组片段,只要顺序相同? - Joseph_J
首先在array_1上使用array_intersect,然后使用此解决方案https://dev59.com/I3PYa4cB1Zd3GeqPn9dY - sagar patel
不,我不需要唯一值。如果第一个数组的元素连续地包含在第二个数组中,我想要返回true/false。 - Habib Hassan
@Joseph_J 不,这两个数组的长度不相同。 - Habib Hassan
@HabibHassan,看看这个 https://3v4l.org/0EgPq - Sohel0415
显示剩余6条评论
4个回答

4

编辑 3:

正如尼克指出的那样,在某些情况下,这种方法是行不通的。例如:$a = ['a-b', 'c']; $b = ['a', 'b'];

请查看他的解决方案。

这种方法并非总是可行:

$array_1 = ['A', 'B', 'C', 'D', 'E', 'F'];
$array_2 = ['B', 'C', 'D'];

if (str_contains(implode('-', $array_1), implode('-', $array_2))) {
    return true;
}

return false;

或者简单地说:
return str_contains(implode('-', $array_1), implode('-', $array_2));

我将数组进行了内部压缩(将数组转换为字符串,并用 - 连接),然后使用 Laravel 的 str_contains(haystack, needle) 方法检查 $array_2 的字符串是否为 $array_1 的字符串的子串。


真的。这不起作用。str_contains是Laravel的助手函数。该问题有Laravel标签。 - DevK
1
如果添加粘合剂,这将更好。但是,如果值中包含粘合字符或者$array_2中的值是$array_1中值的子字符串,则仍可能存在问题。例如,如果$array_1 = ['A', 'BB', 'C', 'D', 'E', 'F'];,则它将返回true。 - Nick
新版本将无法工作,例如 $array_1 = ['A', 'C', 'C', 'D', 'E', 'F'];$array_2 = ['C', 'D', 'E']; :-( - Nick
当然。嗯,我要睡觉了。这个问题很酷,我相信我们错过了一些非常好的解决方案。但今晚不行。我会继续努力,因为我认为如果你知道字符串只有一个字符长,我的原始解决方案非常好。 - DevK
我相信我发布的解决方案(使用 json_encode)解决了这个鲁棒性问题,同时保持了简单性,但我猜OP不需要它 :) - Jeto

3
以下是翻译的结果:

下面是一个函数,它可以稳健地检查$array_2中的值是否与$array_1中的值按照同样的顺序一一对应(即具有连续的索引):

function compare_arrays($array_1, $array_2) {
    $count_1 = count($array_1);
    $count_2 = count($array_2);
    for ($i = 0; $i < $count_1 - $count_2 + 1; $i++) {
        if ($array_1[$i] == $array_2[0]) {
            for ($j = 1; $j < $count_2 && $i + $j < $count_1; $j++) {
                if ($array_1[$i+$j] != $array_2[$j]) break;
            }
            if ($j == $count_2) return true;
        }
    }
    return false;
}
$array_1 = ['A', 'B', 'C', 'D', 'E', 'F'];
$array_2 = ['B', 'C', 'D'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";
$array_2 = ['C', 'D', 'B'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";
$array_2 = ['B', 'D', 'E'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";
$array_2 = ['A', 'B', 'C'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";
$array_1 = ['A', 'C', 'C', 'D', 'E', 'F'];
$array_2 = ['C', 'D', 'E'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";

输出:

true 
false 
false 
true 
true

在 3v4l.org 上的演示


3
除非我漏掉了什么,您可以简单地执行以下操作:
$result = strpos(
  implode(array_map('json_encode', $input1)), 
  implode(array_map('json_encode', $input2))
) !== false;

这基本上将每个输入转换为一个字符串,其中每个值都是JSON编码的,然后检查第二个输入是否是第一个输入的一部分。
演示请点击此处:https://3v4l.org/eAQst

0

我喜欢这个问题,也喜欢不同的解决方案。虽然我来晚了,但这是我的尝试。我不知道它在大数据集成本方面如何比较,但这应该相当健壮。

我的尝试只是遍历每个元素,然后创建一个与搜索数组大小相同的第二个数组,最后进行比较检查。

代码:

function checkArray($a, $b){

  $test = FALSE;

  for($i = 0; $i < count($a); $i++){

    for($j = 0; $j < count($b); $j++){

      $array[] = $a[$i + $j];

    }

    if($array == $b){

      $test = TRUE;
      break;

    }

    unset($array);

  }

return $test;

}


$sample = ['A', 'B', 'C', 'D', 'E', 'F'];
$match = ['B', 'C', 'D'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //True
$match = ['C', 'D', 'B'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //False
$match = ['B', 'D', 'E'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //False
$match = ['A', 'B', 'C'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //True
$match = ['A'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //True
$match = ['F'];
echo checkArray($sample, $match) ? "true\n" : "false\n";//True
$sample = ['A', 'C', 'C', 'D', 'E', 'F'];
$match = ['C', 'D', 'E'];
echo checkArray($sample, $match) ? "true\n" : "false\n";//True
$sample = ['C', 'D', 'E'];
$match = ['A', 'C', 'C', 'D', 'E', 'F'];
echo checkArray($sample, $match) ? "true\n" : "false\n";//False

这将输出:

true
false
false
true
true
true
true
false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接