Checking if an array contains all elements of another array

后端 未结 6 629
滥情空心
滥情空心 2020-12-06 19:23

I\'m designing an electrical engineering application. However, i\'m stuck on this: I have the following array



        
相关标签:
6条回答
  • 2020-12-06 19:46

    Given your sample arrays, the output of this will be:

    > 0
    

    In case you HAD to have only one number output, this should do that:

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

    EDIT: Made a function. Returns first matched index or -1 for no matches:

    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);
    
    0 讨论(0)
  • 2020-12-06 19:50

    You are comparing count which is not enough, as numbers could be changed. Try this:

    // 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 讨论(0)
  • 2020-12-06 19:52

    You can try :

    $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]);
    }
    
    0 讨论(0)
  • 2020-12-06 20:01

    Count the total of $GroupOfEight[$i]
    Count the total of $myStack
    if totals are equal:
    In a loop -
    if $myStack[$c] is in_array($GroupOfEight[$i]): $equal = 1
    else $equal = 0; exit;

    if $equal == 1 -> arrays are identical

    0 讨论(0)
  • 2020-12-06 20:09

    The thing that is wrong with your original approach is that you loop through GroupOfEight twice. You have two for-loops.
    First you select every array within GroupOfEight and in the second for loop you go through each value of the array.

    If you would like to use your original approach, get rid of the extra for loop:

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

    Demo: http://codepad.viper-7.com/0hRNHz

    You could accomplish the same with 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);
        }
    }
    

    Demo: http://codepad.viper-7.com/6uLd9L

    Update
    A related SO post is: Check whether two array values are equal (ignoring order)

    0 讨论(0)
  • 2020-12-06 20:11

    We do not need any loops. Try this

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

    Output

    0

    Note: Output $key is location of the array in $GroupOfEight i.e ( $GroupOfEight[0] )

    0 讨论(0)
提交回复
热议问题