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;
}
?>

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

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

4

6 回答 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);
于 2012-10-12T21:31:51.673 回答
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]);
}
于 2012-10-12T21:30:53.547 回答
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帖子是:检查两个数组值是否相等(忽略顺序)

于 2012-10-12T21:39:23.183 回答
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);
于 2012-10-12T21:33:27.850 回答
0

计算 $GroupOfEight[$i]
的总数
如果总数相等,则计算 $myStack 的总数:
在循环中 -
如果 $myStack[$c] is in_array($GroupOfEight[$i]): $equal = 1
else $equal = 0; 出口;

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

于 2012-10-12T21:34:54.083 回答
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])

于 2015-10-23T13:03:21.320 回答