开发者

Creating matches with 3 arrays

开发者 https://www.devze.com 2023-02-04 05:29 出处:网络
I have an issue with an application that I\'m developing for a car pooling program in my company (the process is kind of complex). What I want to do is the follwoing:

I have an issue with an application that I'm developing for a car pooling program in my company (the process is kind of complex). What I want to do is the follwoing:

I have 3 teams of 3 people, each team has a unique member id for instance:

Group 1 = (1,2,3,4)

Group 2 开发者_开发技巧= (5,6,7,8)

Group 3 = (9,10,11,12)

The idea is to make as many combinations as possible of 2 members (I think it is at least 8 per member) without matching with someone from the same group.

For example

1-5 1-6 1-7 1-8 1-9 1-10 1-11 1-12 2-5 2-6 2-7 2-8 2-9 ... and so on

This is a code snippet (it might not have sense with what I want to achieve but I'm a junior programmer)

<?php

$numberSet = array( range(1,4),
                    range(5,8),
                    range(9,12) 
             ); 

$sizeofArray=count($numberSet); 

    for ($i=0; $i<$sizeofArray; $i++){
        for ($j=0; $j<count($numberSet[$i]); $j++){
            for ($k=0; $k<count($numberSet[$i]); $k++){
                echo $numberSet[$i][$j] . "<br>";
            }
        }   
    }   
?>


If you clear up what it is you actually want to achieve, it maybe a little more help, but to be going on with, here is one way to get all the matches for a member of one group, without matching it to anyone from its own group - I will assume you plan on having multiple ID's and not a simple 1234, 5678, 9 10 11 12 in your working set:

    // Build an example array:
    $numberSet = array( range(1,4),
                        range(5,8),
                        range(9,12) ); 

    // The function will return an array of matches when passed the array and the ID:
    function findCombos($id, $set)
    {
        // Store the matches found:
        $matches = array();
        // Loop through each array in the multidimensional array which was passed:
        foreach ($set as $group)
        {
            // Make sure the ID passed isn't a member of the current array, don't want its matches:
            if (!in_array($id, $group))
            {
                // Loop through each array as the ID isn't a member of this group:
                foreach ($group as $member)
                {
                    // Add the match the the matches array:
                    $matches[] = $member;
                }
            }
        }
        // Pass the matches back:
        return $matches;
    }

Finally looking for a single users matches:

    // Find all the matches for ID 2 from the multidimensional array:
    $matches = findCombos("2", $numberSet);
    // Display the nubmer of matches:
    echo "Found ".count($matches)." matches for 2.<br/>";
    // Loop through each match found:
    foreach ($matches as $match)
    {
        // Display the results:
        echo "2 - ".$match."<br/>";
    }

Results:

Found 8 matches for 2.
2 - 5
2 - 6
2 - 7
2 - 8
2 - 9
2 - 10
2 - 11
2 - 12

If you wanted to show all possibilities you could do something like this:

    $count = 0;
    foreach ($numberSet as $group)
    {
        foreach ($group as $member)
        {
            $matches = findCombos($member, $numberSet);   
            $count = $count+count($matches);      
            foreach ($matches as $match)
            {
                echo $member." - ".$match.", ";
            }
        }
    }
    echo "<br/>Found ".$count." possible combinations.";

Results:

1 - 5, 1 - 6, 1 - 7, 1 - 8, 1 - 9, 1 - 10, 1 - 11, 1 - 12, 2 - 5, 2 - 6, 2 - 7, 2 - 8, 2 - 9, 2 - 10, 2 - 11, 2 - 12, 3 - 5, 3 - 6, 3 - 7, 3 - 8, 3 - 9, 3 - 10, 3 - 11, 3 - 12, 4 - 5, 4 - 6, 4 - 7, 4 - 8, 4 - 9, 4 - 10, 4 - 11, 4 - 12, 5 - 1, 5 - 2, 5 - 3, 5 - 4, 5 - 9, 5 - 10, 5 - 11, 5 - 12, 6 - 1, 6 - 2, 6 - 3, 6 - 4, 6 - 9, 6 - 10, 6 - 11, 6 - 12, 7 - 1, 7 - 2, 7 - 3, 7 - 4, 7 - 9, 7 - 10, 7 - 11, 7 - 12, 8 - 1, 8 - 2, 8 - 3, 8 - 4, 8 - 9, 8 - 10, 8 - 11, 8 - 12, 9 - 1, 9 - 2, 9 - 3, 9 - 4, 9 - 5, 9 - 6, 9 - 7, 9 - 8, 10 - 1, 10 - 2, 10 - 3, 10 - 4, 10 - 5, 10 - 6, 10 - 7, 10 - 8, 11 - 1, 11 - 2, 11 - 3, 11 - 4, 11 - 5, 11 - 6, 11 - 7, 11 - 8, 12 - 1, 12 - 2, 12 - 3, 12 - 4, 12 - 5, 12 - 6, 12 - 7, 12 - 8,

Found 96 possible combinations.

If you chenage $numberSet to:

   $numberSet = array( array("a","b"),
                array("c", "d", "e", "f"),
                array("joe", "tom", "same") 
         );

The result:

a - c, a - d, a - e, a - f, a - joe, a - tom, a - same, b - c, b - d, b - e, b - f, b - joe, b - tom, b - same, c - a, c - b, c - joe, c - tom, c - same, d - a, d - b, d - joe, d - tom, d - same, e - a, e - b, e - joe, e - tom, e - same, f - a, f - b, f - joe, f - tom, f - same, joe - a, joe - b, joe - c, joe - d, joe - e, joe - f, tom - a, tom - b, tom - c, tom - d, tom - e, tom - f, same - a, same - b, same - c, same - d, same - e, same - f,


You might want to take a look at array_diff(). I could see something like this working:

$everyone=range(1,12);
$groups=array(range(1,4), range(5,8), range(9,12));
$cnt=count($groups);
for($i=0;$i<$cnt;$i++) {
    // this will give you all the people who aren't in your group
    $diff=array_diff($everyone,$groups[$i]);

    // loop and compare here 
}

What wasn't clear to me is if the pair "1-5" and "5-1" are the same or not i.e. you need them to be unique pairs.


if it's only calculating pairs of 2 (and no higher), you can simply count the other two arrays.

for anyone in array1, simply count(array2) + count(array3) = number of pairs

0

精彩评论

暂无评论...
验证码 换一张
取 消