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

別の配列がありますが、これは 1 次元です。

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

数値を1つだけ出力する必要がある場合は、次のようにする必要があります。

<?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を2回ループすることです。2つのforループがあります。
最初にGroupOfEight内のすべての配列を選択し、2番目の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の投稿は次のとおりです。2つの配列値が等しいかどうかを確認します(順序を無視します)

于 2012-10-12T21:39:23.183 に答える
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 に答える
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 の合計をカウントします: ループ内 - if $myStack[$c] is in_array($GroupOfEight[$i]): $equal = 1 else $equal = 0; 出口;




$equal == 1 の場合 -> 配列は同一です

于 2012-10-12T21:34:54.083 に答える