Creating matches with 3 arrays
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
精彩评论