1

私は、ユーザーが2セットの情報を入力し、2セットの可能なすべての組み合わせを印刷できるアプリケーションをPHPで作成しています。目標は、質問と回答のさまざまなパターンを練習することにより、言語を学習するための教育ツールとしてそれを使用することです。

たとえば、「試したことはありますか...?」という質問を練習することがあります。さらに、バンジージャンプ、パラセーリング、スカイダイビング、​​スキューバダイビングなどの4つのアクティビティの1つ。また、4つの可能な答えがあります。

  1. はい、私は持っています、そして私はそれを楽しんだ。
  2. はい、ありますが、気に入らなかった。
  3. いいえ、していませんが、やってみたいです。
  4. いいえ、私はしていません、そして私はそれを試したくありません。

ユーザーは2つのデータセットを入力し、アプリケーションは質問と回答のすべての可能な組み合わせを含むカードのシートを印刷します。たとえば、カード1は次のようになります。

  1. スカイダイビング:はい、私は持っています、そして私はそれを楽しんだ。
  2. スキューバダイビング:はい、ありますが、気に入らなかったです。
  3. パラセーリング:いいえ、していませんが、試してみたいです。
  4. バンジージャンプ:いいえ、私はしていません、そして私はそれを試したくありません。

次のカードは次のようになります。

  1. スカイダイビング:はい、ありますが、気に入らなかったです。
  2. スキューバダイビング:いいえ、していませんが、やってみたいです。
  3. パラセーリング:いいえ、私はしていません、そして私はそれを試したくありません。
  4. バンジージャンプ:はい、私は持っています、そして私はそれが好きでした。

ご覧のとおり、さまざまな組み合わせが考えられます。アイデアは、すべての可能性を印刷できるように、両方のリストが同じ長さになるということです。また、どのカードでも質問や回答が2回以上使用されないようにすること、および2枚のカードを同じにすることができることも重要です。これについて行くための最良の方法は何でしょうか?実際の入出力は問題ではありません-私は以前に同様のことをしました。組み合わせを生成するためのアルゴリズムが必要です。

編集:私が本当に求めているのは、各カードのアクティビティを同じ順序に保つことですが、答えの可能なすべての組み合わせを持っていると思います。したがって、私が本当に必要としているのは、answers配列からデータを取得するための次の一連のインデックスを生成できるようにすることです。だから私は本当にこのようなものが欲しいです:

  • 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

...可能なすべての組み合わせが生成されるまで、以下同様です。

4

2 に答える 2

5

これを試して:

$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";
    }
}
于 2012-10-05T00:01:06.510 に答える
1

OK、新しい基準で、私はもう少しよく理解していると思います。

再帰を試してください。私の解決策は地獄のように厄介ですが、私はあなたにそれを説明することができます:

$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>';
}
于 2012-10-06T07:50:12.627 に答える