【问题标题】: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 的所有值

标签: php arrays multidimensional-array array-intersect


【解决方案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])

      【讨论】:

        猜你喜欢
        • 2019-05-05
        • 2021-06-04
        • 2016-11-16
        • 2021-12-30
        • 2020-11-21
        相关资源
        最近更新 更多