检查一个数组是不是包含另一个数组的所有元素

Posted

技术标签:

【中文标题】检查一个数组是不是包含另一个数组的所有元素【英文标题】:Checking if an array contains all elements of another array检查一个数组是否包含另一个数组的所有元素 【发布时间】:2012-10-12 21:25:01 【问题描述】:

我正在设计一个电气工程应用程序。但是,我坚持这一点: 我有以下数组

<?php 
// Static Array
$GroupOfEight = array (
                      array(0,1,3,2,4,5,7,6),
                      array(4,5,6,7,16,12,13,14),
                      array(12,13,15,14,8,9,11,10),
                      array(2,6,14,10,3,7,15,11),
                      array(1,3,5,7,13,15,9,11),
                      array(0,4,12,8,1,5,13,9),
                      array(0,1,3,2,8,9,11,10)
                      );
?>

我还有另一个数组,但这个是一维的。

<?php
$myStack = array(0,1,3,2,4,5,7,6); //Dynamic, gets value by POST method.
?>

我想要做的是检查 $myStack 是否等于 $GroupOfEight 数组的任何子数组。 (编号顺序并不重要。脚本应该只检查是否包含每个元素。它们的顺序是否相同并不重要。)

到目前为止,我为解决此问题所做的工作如下:

<?php
//Check if stackArray contains 8group
for($i=0; $i<count($GroupOfEight);$i++)
for($j=0; $j<count($GroupOfEight[$i]); $j++)
    //$containsSearch = count(array_intersect($search_this,$all)) == count($search_this);
    $containsSearch = count(array_intersect($stackArray,$GroupOfEight[$j])) == count($stackArray);
    echo $containsSearch;

?>

请帮我更正我的代码或向我介绍这个问题的解决方案, 谢谢。

编辑:它应该只给出 1 个索引号。例如 stackArray 是 0,1,3,2,4,1,2,3 并且它应该找到与相同数字匹配的 GroupOfEight[N] ,而不管数字的顺序如何。如果有匹配的案例,我应该得到 N。

【问题讨论】:

您是否已将 $stackarray 分配到某个地方?此外,您不需要两个循环;一个很好。 是的,但我需要检查 GroupOfEight 的所有行 第一个循环检查 GroupOfEight 的所有值 【参考方案1】:

给定您的示例数组,其输出将是:

> 0

如果您必须只输出一个数字,则应该这样做:

<?php
//Check if stackArray contains 8group
$check=false;
for($i=0; $i<count($GroupOfEight);$i++)
    //$containsSearch = count(array_intersect($search_this,$all)) == count($search_this);
    $containsSearch = (count(array_intersect($stackArray,$GroupOfEight[$i])) == count($stackArray) && count(array_intersect($stackArray,$GroupOfEight[$i])) == count($GroupOfEight[$i]));
    if($containsSearch && !$check)
        echo $i; //This specifies which index in GroupOfEight contains a matching array
        $check=true;
    

?>

编辑:做了一个函数。返回第一个匹配的索引或 -1 表示没有匹配:

function searcheight($stackArray,$GroupOfEight)
    for($i=0; $i<count($GroupOfEight);$i++)
        $containsSearch = (count(array_intersect($stackArray,$GroupOfEight[$i])) == count($stackArray) && count(array_intersect($stackArray,$GroupOfEight[$i])) == count($GroupOfEight[$i]));
        if($containsSearch)
            return $i; //This specifies which index in GroupOfEight contains a matching array
        
    
    return -1;

echo searcheight($stackArray,$GroupOfEight);

【讨论】:

好像错误已经消失了,但是让我问你一些事情。如何检查 $GroupOfEight 中每个索引的 $stackArray,如果有则返回索引号。这将完全解决我的问题,并为我节省一些时间。谢谢。 当你运行 array_intersect 时,它会返回一个数组,其中填充了两者中存在的值。 我已对其进行了编辑以也呼应该数字。所以如果你得到 true0true1false2true3... 这意味着 stackArray 匹配 0,1,3 等。显然你想做一些比仅仅回显索引更好的事情。 这不是我实际要求的,它应该只给出 1 个索引号。例如 stackArray 是 0,1,3,2,4,1,2,3 并且它应该找到与相同数字匹配的 GroupOfEight[N] ,而不管数字的顺序如何。如果有匹配的案例,我应该得到 N。请帮忙。谢谢 是的,有一个问题,我必须检查两个方向的交叉点。现在修复了,这里是fiddle【参考方案2】:

你可以试试:

$searchKeys = array();
foreach ( $GroupOfEight as $key => $values ) 
    (count(array_intersect($values, $myStack)) == count($myStack)) and $searchKeys[] = $key;


#Output all keys it found same match
var_dump($searchKeys);

#OR Output Each Array it found a match
foreach($searchKeys as $key)

    var_dump($GroupOfEight[$key]);

【讨论】:

(count(array_intersect($values, $myStack)) == count($myStack)) 和 $searchKeys[] = $key;此行遇到问题 它工作正常...codepad.viper-7.com/M718f0 也见codepad.org/JUZdy1zF ..你用的是什么版本的 PHP ??? 警告:array_intersect() [function.array-intersect]: Argument #2 is not a array in \scripts\script.php on line 1771 array(0) 这是我得到的错误 请注意我使用了$myStack ????您同时拥有 $stackArray 和 $myStack ...我确定这是遗漏的地方 是的,我看错了 myStack。但这就是我所寻求的:它应该只给出 1 个索引号。例如 stackArray 是 0,1,3,2,4,1,2,3 并且它应该找到与相同数字匹配的 GroupOfEight[N] ,而不管数字的顺序如何。如果有匹配的案例,我应该只得到 1 N 个号码。请帮忙。谢谢【参考方案3】:

原始方法的问题在于您循环通过 GroupOfEight 两次。您有两个 for 循环。 首先选择 GroupOfEight 中的每个数组,然后在第二个 for 循环中遍历数组的每个值。

如果您想使用原来的方法,请去掉额外的 for 循环:

echo "Hello, World!";
$GroupOfEight = array (
              array(0,1,3,2,4,5,7,6),
              array(4,5,6,7,16,12,13,14),
              array(12,13,15,14,8,9,11,10),
              array(2,6,14,10,3,7,15,11),
              array(1,3,5,7,13,15,9,11),
              array(0,4,12,8,1,5,13,9),
              array(0,1,3,2,8,9,11,10)
              );

$myStack = array(0,1,3,2,4,5,7,6); //Dynamic, gets value by POST method.


for($i=0; $i<count($GroupOfEight);$i++)        
    $containsSearch = count(array_intersect($myStack,$GroupOfEight[$i])) == count($myStack);
    if($containsSearch===true) 
        echo "Woo! GroupOfEight[$i], <br/>" . print_r($GroupOfEight[$i], true) . "<br/>==<br/>" . print_r($myStack, true);
    

演示:http://codepad.viper-7.com/0hRNHz

你可以用array_diff完成同样的事情:

for($i=0; $i<count($GroupOfEight);$i++)                
    if(count(array_diff($myStack,$GroupOfEight[$i]))==0) 
        echo "Woo! GroupOfEight[$i], <br/>" . print_r($GroupOfEight[$i], true) . "<br/>==<br/>" . print_r($myStack, true);
    

演示:http://codepad.viper-7.com/6uLd9L

更新 一个相关的 SO 帖子是:Check whether two array values are equal (ignoring order)

【讨论】:

【参考方案4】:

您正在比较 count 这还不够,因为数字可能会更改。试试这个:

// Static Array
$GroupOfEight = array (
    array(0,1,3,2,4,5,7,6),
    array(4,5,6,7,16,12,13,14),
    array(12,13,15,14,8,9,11,10),
    array(2,6,14,10,3,7,15,11),
    array(1,3,5,7,13,15,9,11),
    array(0,4,12,8,1,5,13,9),
    array(0,1,3,2,8,9,11,10)
    );

$myStack = array(0,1,3,2,4,5,7,6); //Dynamic, gets value by POST method.

$containsSearch = false;
foreach($GroupOfEight as $key => $value)
    if ($myStack == $value) 
        $containsSearch = true;
    



var_dump($containsSearch);

【讨论】:

【参考方案5】:

统计$GroupOfEight[$i]的总数 计算 $myStack 的总数 如果总数相等: 在一个循环中 - 如果 $myStack[$c] 是 in_array($GroupOfEight[$i]): $equal = 1 否则 $ 等于 = 0;退出;

如果 $equal == 1 -> 数组相同

【讨论】:

请更好地格式化您的代码并在您的代码 sn-ps 周围使用代码示例。【参考方案6】:

我们不需要任何循环。试试这个

<?php 
$GroupOfEight = array (
                      array(0,1,3,2,4,5,7,6),
                      array(4,5,6,7,16,12,13,14),
                      array(12,13,15,14,8,9,11,10),
                      array(2,6,14,10,3,7,15,11),
                      array(1,3,5,7,13,15,9,11),
                      array(0,4,12,8,1,5,13,9),
                      array(0,1,3,2,8,9,11,10)
                      );
$myStack = array(0,1,3,2,4,5,7,6);

$key = '';
$key = array_search($myStack,$GroupOfEight);
echo $key;
?>

输出

0

注意: 输出 $key 是数组在 $GroupOfEight 中的位置,即 ($GroupOfEight[0])

【讨论】:

以上是关于检查一个数组是不是包含另一个数组的所有元素的主要内容,如果未能解决你的问题,请参考以下文章

要检查数组是不是仅包含另一个数组中的元素,VB.NET

如何检查一个数组是不是包含另一个数组的任何元素

检查一个数组是不是包含 JavaScript 中另一个数组的任何元素

检查一个数组是不是包含 JavaScript 中另一个数组的任何元素

检查数组是不是包含另一个数组及其在 DART/Flutter 中的位置

如何检查包含另一个对象数组的对象数组是不是具有属性