【问题标题】:How can I use in_array if the needle is an array?如果针是数组,我如何使用 in_array?
【发布时间】:2011-01-19 06:03:51
【问题描述】:

我有 2 个数组,值将从数据库中加载,下面是一个示例:

$arr1 = array(1,2,3);
$arr2 = array(1,2,3,4,5,6,7);

我要做的是检查$arr1 中的所有值 是否存在于$arr2 中。上面的例子应该是TRUE while:

$arr3 = array(1,2,4,5,6,7);

比较$arr1$arr3 将返回FALSE

通常我使用in_array,因为我只需要将单个值检查到数组中。但在这种情况下,in_array 不能使用。我想看看是否有一种简单的方法可以用最少的循环进行检查。

更新说明。

第一个数组将是一个包含唯一值的集合。第二个数组可以包含重复的值。在处理之前,它们都保证是一个数组。

【问题讨论】:

  • 可能值得澄清:您是否在寻找正常的“设置”语义?如果第二个数组是 array(1,2,4,3),你会期待什么结果?如果第一个是数组(1,1,1,1)怎么办?还是它们是非法的?

标签: php arrays search compare


【解决方案1】:

使用array_diff():

$arr1 = array(1,2,3);
$arr2 = array(1,2,3,4,5,6,7);
$arr3 = array_diff($arr1, $arr2);
if (count($arr3) == 0) {
  // all of $arr1 is in $arr2
}

【讨论】:

  • +1 将我指向array_diff() 函数并给出使用示例。
  • 当数组值是字符串时,这不能很好地工作。
  • @Tamim 你找到字符串值的替代解决方案了吗
【解决方案2】:

您可以使用array_intersectarray_diff

$arr1 = array(1,2,3);
$arr2 = array(1,2,3,4,5,6,7);

if ( $arr1 == array_intersect($arr1, $arr2) ) {
    // All elements of arr1 are in arr2
}

但是,如果您不需要使用交集的结果(这似乎是您的情况),则使用 array_diff 更节省空间和时间:

$arr1 = array(1,2,3);
$arr2 = array(1,2,3,4,5,6,7);
$diff = array_diff($arr1, $arr2);

if ( empty($diff) ) {
    // All elements of arr1 are in arr2
}

【讨论】:

  • +1 表示指向array_intersect() 函数并给出使用示例。
  • array_intersect 的行为与array_diff 不同。 array_intersect 返回常用元素。如果$arr1 包含$arr2 中不存在的值,则结果将与array_diff 不同,并且此结果对于anwser 来说是错误的。
【解决方案3】:

您可以尝试使用array_diff() 函数来查找两个数组之间的差异,这可能会对您有所帮助。我想澄清一下你的意思是,第一个数组中的所有值都必须在第二个数组中,但不能反过来。

【讨论】:

  • 是的,山姆。所有$arr1 值必须出现在第二个数组中,以获得TRUE 条件,否则为FALSE。我去看看array_diff()。谢谢
【解决方案4】:

在我的特殊情况下,我需要检查之前是否处理过一对 id。如此简单的array_diff() 对我不起作用。

相反,我从按字母顺序排序的 id 生成键并将它们与 in_array 一起使用:

<?php
$pairs = array();
// ...
$pair = array($currentId, $id);
sort($pair);
$pair = implode('-', $pair);
if (in_array($pair, $pairs)) {
    continue;
}
$pairs[$pair] = $pair;

这可能根本不是最佳解决方案,但我只需要它来执行一次脏脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2018-01-04
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多