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

6
我是一个能翻译文本的助手。
我正在设计一个电气工程应用程序。然而,我卡在这里了: 我有以下数组。
<?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;
}
?>

请帮我纠正我的代码或介绍解决此问题的方法,谢谢。 编辑:它应该只给出一个索引号。例如,stackArray是0、1、3、2、4、1、2、3,它应该找到与相同数字匹配的GroupOfEight[N],不考虑数字的顺序。如果有匹配的情况,我应该得到N。

2
你在某处分配了 $stackarray 吗?而且,你不需要使用两个循环;一个就好。 - Asad Saeeduddin
是的,但我需要检查GroupOfEight的所有行。 - mozcelikors
1
第一个循环检查 GroupOfEight 中的所有值。 - Asad Saeeduddin
6个回答

3
根据您提供的样本数组,此功能的输出将是:
> 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);

实际上这不是我要求的,它应该只给出一个索引号。例如,stackArray是0、1、3、2、4、1、2、3,它应该找到与相同数字匹配的GroupOfEight[N],而不考虑数字的顺序。如果存在匹配情况,我应该得到N。请帮忙。谢谢。 - mozcelikors
如果你确定 GroupOfEight 中只有一个成员匹配,那么这将输出该成员的索引。 - Asad Saeeduddin
$i就是你要找的“N”。这个答案对你来说完全没问题。 - Terry Seidler
这似乎是有效的,唯一的问题是:我可能也会得到0索引号。因此,当我给$stackArray任何不满足程序输出的值时,它会输出0。那么如何使0与错误情况有所区别呢? - mozcelikors
1
是的,出现了问题,我必须双向检查交集。现在已经修复了,这里是fiddle - Asad Saeeduddin
显示剩余8条评论

1

您可以尝试:

$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]);
}

请注意,我使用了 $myStack?你同时拥有 $stackArray 和 $myStack... 我相信那就是出错的地方。 - Baba
是的,我打错了myStack,我知道。但这就是我想要的:它应该只给出一个索引号。例如,stackArray是0、1、3、2、4、1、2、3,它应该找到与相同数字匹配的GroupOfEight[N],而不考虑数字的顺序。如果存在匹配情况,我应该只得到1个N数字。请帮忙。谢谢。 - mozcelikors
@mozcelikors 但是 0,1,3,2,4,1,2,3 不在上面的数组列表中..为什么应该显示 1???如果我理解你的逻辑,我肯定可以想出一些简单的东西。 - Baba
我举了0、1、3、2等数字作为例子。让我重新说明一下:把$stackArray看作是0、1、3、2、4、5、7、6,那么$GroupOfEight[0]也是这样。在这种情况下,我应该得到“0”号(即索引号)。但如果顺序被打乱了,比如$stackArray = 0、1、2、3、4、12、3($GroupOfEight中没有包含这个顺序),那么只需要输出一个“不满足”的提示就可以了。希望清楚明白。 - mozcelikors
@mozcelikors,没有一个数组中同时包含123的位置...那么0,1,2,3,4,12,3怎么会在$GroupOfEight中呢?我也没有使用echo,我将所有键添加到$searchKeys中供您使用。 - Baba
显示剩余3条评论

1
你原来的方法有问题,就是你在 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帖子是:检查两个数组值是否相等(忽略顺序)


0

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

<?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])


0

您正在比较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);

0

计算 $GroupOfEight[$i] 的总数
计算 $myStack 的总数
如果两个总数相等:
在一个循环中 -
如果 $myStack[$c] 在 $GroupOfEight[$i] 中: $equal = 1
否则 $equal = 0; exit;

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


请更好地格式化您的代码,并在代码片段周围使用“代码示例”。 - user1386320

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