Проверка, содержит ли массив все элементы другого массива

Я разрабатываю электротехническое приложение. Тем не менее, я застрял на этом: у меня есть следующий массив

<?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, если есть соответствующий случай.

6 ответов

Решение

Учитывая ваши образцы массивов, результат этого будет:

> 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 У вас есть две петли.
Сначала вы выбираете каждый массив в 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: Проверьте, равны ли два значения массива (игнорируя порядок)

Ты можешь попробовать:

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

Подсчитайте сумму $GroupOfEight[$i]
Подсчитайте сумму $myStack
если итоги равны:
В цикле -
если $myStack[$c] равен in_array($GroupOfEight[$i]): $ равно = 1
иначе $ равно = 0; выход;

если $ равный == 1 -> массивы идентичны

Нам не нужны петли. Попробуй это

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

Вы сравниваете 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);
Другие вопросы по тегам