Я пишу приложение на PHP, где пользователи могут вводить два набора информации и выставлять каждую возможную комбинацию двух наборов. Цель состоит в том, чтобы использовать его в качестве учебного инструмента для изучения языка, применяя различные шаблоны вопроса и ответа.
Например, мы можем практиковать вопрос «Вы когда-нибудь пробовали …?» плюс один из четырех видов деятельности, таких как прыжки с банджи, парапланы, прыжки с парашютом и подводное плавание. Также было бы четыре возможных ответа:
Пользователь вводит два набора данных, и приложение затем распечатывает листы карточек, содержащие все возможные комбинации вопросов и ответов. Например, карта 1 будет выглядеть так:
Следующая карта может выглядеть следующим образом:
Таким образом, вы можете видеть, что существует много разных возможных комбинаций. Идея состоит в том, что оба списка будут иметь одинаковую длину, чтобы можно было распечатать все возможности. Также важно, чтобы ни один вопрос или ответ не использовался более одного раза на любой карте и что две карты могут быть одинаковыми. Какой был бы лучший способ сделать это? Фактический ввод и вывод не является проблемой – раньше я делал подобные вещи. Мне просто нужен алгоритм для создания комбинаций.
EDIT: Я предполагаю, что я действительно буду следить за тем, чтобы действия в одном порядке для каждой карты, но есть все возможные комбинации ответов. Поэтому мне действительно нужно иметь возможность создавать следующий набор индексов для получения данных из массива ответов. Поэтому я действительно хочу что-то большее:
… и так далее, пока не будут созданы все возможные комбинации.
ОК, с новыми критериями, я думаю, я понимаю немного лучше.
Попробуйте рекурсию. Мое решение грязно, как черт, но я могу пройти через него:
$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"; } }