2011-01-11 2 views
0

У меня проблема с приложением, которое я разрабатываю для программы объединения автомобилей в моей компании (процесс является довольно сложным). То, что я хочу сделать, это происходит некорректно:Создание совпадений с 3 массивами

У меня есть 3 команды из 3 людей, каждая команда имеет уникальный идентификатор участника, например:

Группа 1 = (1,2,3,4)

Группа 2 = (5,6,7,8)

Группа 3 = (9,10,11,12)

идея заключается в том, чтобы сделать так много комбинаций, как можно из 2-х человек (я думаю, что это не менее 8 на каждого члена) без согласования с кем-то из той же группы.

Например

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 ... и так далее

Это фрагмент кода (он не может иметь смысл с тем, что я хочу добиться, но я младший программист)

<?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>"; 
      } 
     } 
    } 
?> 
+0

Итак, вы хотите в итоге отобразить список всех возможных комбинаций? Или вы ищете массив комбинаций? Или вы хотите функцию, передать ей идентификатор и вернуть все возможные комбинации для этого идентификатора? – Scoobler

+0

Спасибо за ответ! Я бы хотел напечатать, поскольку я отправил бы список в HR спасибо :) – isJustMe

ответ

1

Если вы очистите то, что вы на самом деле хотите достичь, это может быть немного больше поможет, но, чтобы продолжить, вот один из способов получить все совпадения для члена одной группы, без соответствия никому из своей собственной группы - я предполагаю, что вы планируете иметь несколько идентификаторов, а не просто 1234, 5678, 9 10 11 12 в вашем рабочем наборе:

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

Наконец ищет одного пользователей матчей:

// 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/>"; 
    } 

Результаты:

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

Если вы хотите, чтобы показать все возможности вы могли бы сделать что-то вроде этого:

$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."; 

Результаты:

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,

Найдено 96 возможных комбинаций.

Если вы chenage $ numberSet в:

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

Результат:

а - с, а - д, а - е, а - е, а - Джо, - том, a - то же, b - c, b - d, b - e, b - f, b - joe, b - tom, b - то же, c - a, c - b, c - joe, c - том, c - тот же, d - a, d - b, d - joe, d - tom, d - , e - a, e - b, e - joe, e - tom, e - то же, f - a, f - b, f - joe, f - том, f - то же, 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,

+0

Отличный! с несколькими модификациями это идеально подходит для того, что я ищу! Благодаря! – isJustMe

+0

Нет проблем, я добавил небольшое обновление, чтобы показать количество найденных совпадений. Это будет для одного пользователя или всех пользователей. – Scoobler

0

Если это всего лишь пара пар 2 (и не выше), вы можете просто подсчитать два других массива.

для тех, кто в array1, просто count(array2) + count(array3) = number of pairs

+0

Кстати, этот процесс будет еще проще, если вы сохраните свои данные в базе данных, которую я себе представляю. – dqhendricks

+0

Спасибо за ответ! Я думаю, что в конечном итоге это сделаю, но я хочу сначала получить алгоритм. Спасибо! :) – isJustMe

0

Вы можете взглянуть на array_diff(). Я мог бы увидеть что-то вроде этого работа:

$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 
} 

Что не ясно для меня, если пара «1-5» и «5-1» одни и те же или нет, то есть вам нужно, чтобы они были уникальными пар ,

+0

Спасибо за ответ gadhra! Мне жаль, что я не был достаточно ясен, «1-5» и «5-1» считаются разными парами! Благодаря ! – isJustMe

+0

Кстати, хотя вы предлагаете хорошую душу, я не могу сделать диапазон (1,12), потому что идентификатор может быть не последовательным, например, я мог бы иметь группы от 1 до 4 7 до 10 и т. Д. – isJustMe

Смежные вопросы