skip to Main Content

I’m trying to find if a given 2-element array ($result) exists on a dynamically created multidimentional array.

There are 2 flat arrays ($a and $b) which will be used to generate a haystack array of 2-element combinations.

$a = [1, 2, 3];
$b = [3, 4, 5];

$result = [1,3];

I want to check if the $result array exists (with the two values in either orientation) in the haystack array.

The (cross joined) haystack array ($selections) looks like the following:

[
    [1,3],
    [1,4],
    [1,5],
    [2,3],
    [2,4],
    [2,5],
    [3,4],
    [3,5]
]

Notice that [3,3] is excluded by my application’s logic.

I build $selections this way:

$selections = [];
foreach($a as $s){
    foreach($b as $o){
        if($s == $o){
            continue;
        }
        $selections[] = [$s, $o];
    }
}

The $result should be considered found by the following non-exhaustive list:

  • [1, 3]
  • [3, 1]
  • [2, 5]
  • [3, 3]

But pairs like these should not be considered found:

  • [1, 2]
  • [3, 3]
  • [4, 4]

I tried using array_search(array_search($result, $selections)), but it only wwors if the elements are in order.

Of course, I can write a custom function to iterate through the multidimentional array and check the intersection, but I’m checking if there’s a cleaner way to do this.

2

Answers


  1. You don’t have to create every possible combination, it’s quite expensive.

    It is better to split the $result array and find each element in the arrays $a and $b.

    <?php
    
    $a = [1,2,3];
    $b = [3,4,5];
    
    $result = [3,1];
    
    function isOK($a, $b, $result):bool {
        return $result[1] && in_array($result[0], $a) && in_array($result[1], $b);
    }
    
    $isOK = isOK($a, $b, $result) || isOK($a, $b, array_reverse($result));
    
    var_dump($isOK);
    
    Login or Signup to reply.
  2. To allow out of order rule satisfaction, just check both ways explicitly.

    Code: (Demo)

    var_export(
        $result[0] !== $result[1] 
        && (
            (in_array($result[0], $a) && in_array($result[1], $b))
            || (in_array($result[0], $b) && in_array($result[1], $a))
        )
    );
    

    If the first pair of in_array() calls is satisfied, then the second set will not be executed at all.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search