如何检查其他数组PHP中一个数组的值是否一个接一个?

时间:2019-01-08 05:40:27

标签: php arrays laravel

我的项目一直面临问题。就是这种情况

假设我有两个数组,array_1array_2array_1的值为['A', 'B', 'C', 'D', 'E', 'F'],而array_2的值为['B', 'C', 'D']。如果array_1的值array_2一个接一个,则我希望结果为true。对于上述情况是正确的。现在,如果array_2的值为['C', 'D', 'B'],则它返回false,因为该值不是一个接一个的。这是我尝试过的代码

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

但这不会返回我想做的事情。预先感谢

4 个答案:

答案 0 :(得分: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));

我对数组进行了内爆处理(将它们制成字符串并用-粘合),并检查$array_2的字符串是否是$array_1的字符串的子字符串,以及Laravel的{{3} }

答案 1 :(得分: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

Demo on 3v4l.org

答案 2 :(得分:3)

除非我错过了任何事情,否则您可以执行以下操作:

$result = strpos(
  implode(array_map('json_encode', $input1)), 
  implode(array_map('json_encode', $input2))
) !== false;

这基本上将每个输入转换为一个字符串,其中每个值都是JSON编码的,然后检查第二个输入是否是第一个输入的一部分。

此处演示:https://3v4l.org/eAQst

答案 3 :(得分: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