8

Possible Duplicate:
Checking if an array contains all elements of another array

I have posted something like this to the Stackoverflow before, but the answers do not fully satisfy me. That's why I'm posting the question again, but changing the question all along.

Some people helped me to construct a function that checks if an array($GroupOfEight[$i]) that is an element of a multidimensional array($GroupOfEight) equals another array($stackArray), disregarding the number ordering in the arrays.

However, what I need to check is whether the mentioned array($stackArray) contains any another array($GroupOfEight[$i]) in the multidimensional array($GroupOfEight) or not, that means main array($stackArray) can consist more elements than subarrays($GroupOfEight[$i]).

Here is the one working code that I've gathered so far, but need to be modified to the version I want:

 <?php
    $GroupOfEight = array (
                          array(0,1,3,2,4,5,7,6),
                          array(4,5,6,7,15,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)
                );


    $stackArray = array(0,4,12,1,9,8,5,13,9,2,5,2,10);
    /*$stackArray gets value with POST Method by URL parameter.
    This is just the example. As you see this array contains 
    $GroupOfEight[4], and also it contains many other numbers.*/


    /* The function given below checks if $stackArray equals any
    of the subarrays of $GroupOfEight. However, we want to check
    if $stackArray caontains any of the subarrays of function.
    If it does, function should return the index number, if it
    doesnt it should return -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;
}

// Calling the function that is given above.
echo searcheight($stackArray,$GroupOfEight);
?>

Any logical ideas or solutions will kindly be much appreciated. Thanks.

22
  • What is your expected result ??? Commented Oct 17, 2012 at 14:51
  • For the assumed $stackArray, it should give 4, which is the index of the contained subarray index number in $GroupOfEight Commented Oct 17, 2012 at 14:57
  • 4 is array(1,3,5,7,13,15,9,11) and $stackArray = array(0,4,12,1,9,8,5,13,9,2,5,2,10); .. can't you see 3 is missing in the list ??? Commented Oct 17, 2012 at 14:59
  • oh yes, but you got the idea. it contains a subarray and other elements. i gotta find which one it contains, or does it not. Commented Oct 17, 2012 at 15:00
  • Not quite yet .. what makes array 4 the most qualified Commented Oct 17, 2012 at 15:01

2 Answers 2

9

This one is fast:

function contains_array($array){
    foreach($array as $value){
        if(is_array($value)) {
          return true;
        }
    }
    return false;
}
Sign up to request clarification or add additional context in comments.

4 Comments

always use block brackets {}, even for oneliners like yours return true;. It's good habit that pays of whenever you jump into languages using preprocessor and macros...
You can use a FOR loop, and return the counter if you need the position of the array. Or, instead of returning true, return the array key $array.
I dont think this one does exactly what i asked for, thanks though
I agree with @moz This is the correct answer to a different question. I have no idea why this has so many UVs.
3

You can try

$GroupOfEight = array(
        array(0,1,3,2,4,5,7,6),
        array(4,5,6,7,15,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));

$stackArray = array(0,4,12,1,9,8,5,13,9,2,5,2,10);

function searcheight($stackArray, $GroupOfEight) {
    $list = array();
    for($i = 0; $i < count($GroupOfEight); $i ++) {
        $intercept = array_intersect($GroupOfEight[$i], $stackArray);
        $len = count($intercept);
        if ($len % 4 == 0) {
            $list[$i] = $len;
        }
    }
    arsort($list);
    if (empty($list))
        return - 1;
    return key($list);
}
echo searcheight($stackArray, $GroupOfEight);

Output

5

3 Comments

Baba, I've made modification functions and I've moved to 4 group elimination. Please revise this code and tell where i am wrong. ($GroupOfFour has 16mem) function searchFourTerms($leftArray, $GroupOfFour) { $len4 = count($leftArray); $list4 = array(); for($i4 = 0; $i4 < count($GroupOfFour); $i4 ++) { $intercept4 = array_intersect($GroupOfFour[$i4], $leftArray); $len4 = count($intercept4); if (count($intercept4) % 4 == 0) { $list4[$i4] = $len4; } } arsort($list4); if (empty($list4)) return - 1; return key($list4); }
I think I solved it, but still got some issues. Please move this to chat when you're here.
This answer is unexplained and the other answer (with 12 UVs) is 100% wrong. This page is thus low-value to researchers.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.