Есть ли алгоритм для вывода всех возможных комбинаций двух наборов элементов?

Я пишу приложение на PHP, где пользователи могут вводить два набора информации и выставлять каждую возможную комбинацию двух наборов. Цель состоит в том, чтобы использовать его в качестве учебного инструмента для изучения языка, применяя различные шаблоны вопроса и ответа.

Например, мы можем практиковать вопрос «Вы когда-нибудь пробовали …?» плюс один из четырех видов деятельности, таких как прыжки с банджи, парапланы, прыжки с парашютом и подводное плавание. Также было бы четыре возможных ответа:

  1. Да, и мне это понравилось.
  2. Да, но мне это не понравилось.
  3. Нет, нет, но я хочу попробовать.
  4. Нет, нет, и я не хочу попробовать.

Пользователь вводит два набора данных, и приложение затем распечатывает листы карточек, содержащие все возможные комбинации вопросов и ответов. Например, карта 1 будет выглядеть так:

  1. прыжки с парашютом: Да, у меня есть, и мне это понравилось.
  2. дайвинг: Да, но мне это не понравилось.
  3. parasailing: Нет, у меня нет, но я хочу попробовать.
  4. Банджи-джампинг: Нет, я этого не делал, и я не хочу попробовать.

Следующая карта может выглядеть следующим образом:

  1. прыжки с парашютом: Да, но мне это не понравилось.
  2. дайвинг: Нет, у меня нет, но я хочу попробовать.
  3. parasailing: Нет, у меня нет, и я не хочу попробовать.
  4. Банджи-джампинг: Да, и мне понравилось.

Таким образом, вы можете видеть, что существует много разных возможных комбинаций. Идея состоит в том, что оба списка будут иметь одинаковую длину, чтобы можно было распечатать все возможности. Также важно, чтобы ни один вопрос или ответ не использовался более одного раза на любой карте и что две карты могут быть одинаковыми. Какой был бы лучший способ сделать это? Фактический ввод и вывод не является проблемой – раньше я делал подобные вещи. Мне просто нужен алгоритм для создания комбинаций.

EDIT: Я предполагаю, что я действительно буду следить за тем, чтобы действия в одном порядке для каждой карты, но есть все возможные комбинации ответов. Поэтому мне действительно нужно иметь возможность создавать следующий набор индексов для получения данных из массива ответов. Поэтому я действительно хочу что-то большее:

  • 0,1,2,3
  • 0,1,3,2
  • 0,2,1,3
  • 0,2,3,1
  • 0,3,1,2
  • 0,3,2,1
  • 1,0,2,3
  • 1,0,3,2
  • 1,2,0,3
  • 1,2,3,0

… и так далее, пока не будут созданы все возможные комбинации.

    ОК, с новыми критериями, я думаю, я понимаю немного лучше.

    Попробуйте рекурсию. Мое решение грязно, как черт, но я могу пройти через него:

    $activities = array('a', 'b', 'c', 'd'); // Input all your activities as elements here. $responses = array(1, 2, 3, 4); // Input all your responses as elements here. // Recursive function outputCombos accepts both arrays (for eventual output). // $workingArray is the array of the current branch we're working with. function outputCombos ($activities, $responses, $workingArray) { // Once the working array has been loaded to the maximum amt, print everything out. if (count($workingArray) == count($responses)) { echo "Combo\n"; for ($x = 0; $x < count($activities); $x++) { echo $activities[$x].'::'.$workingArray[$x]."\n"; } // If the working array isn't full, add an element that isn't currently in the working array, and recursively run the function again. } else { foreach ($responses as $response) { // Iterate through list of all possible responses, add it into a new working array and run the function if the response hasn't been used in this working array. if (!in_array($response, $workingArray)) { $newArray = $workingArray; $newArray[] = $response; outputCombos($activities, $responses, $newArray); } } } } foreach ($responses as $response) { echo '<pre>'; // Start each branch of tree with unique response (should be 4 in this case). outputCombos($activities, $responses, array($response)); echo '</pre>'; } 

    Попробуй это:

     $activities = array(); // Input all your activities as elements here. $responses = array(); // Input all your responses as elements here. foreach ($activities as $activity) { foreach ($responses as $response) { echo $activities.' '.$response."\n"; } }