2011-07-29 8 views
1

私は、各行に文のリストを含むテキストファイルを持っています。現在、私は線をランダム化していますが、多くの重複が表示されています。どのようにしてこれらの行を配列にしてそれらをすべてランダムに表示することができますが、すべての文章が表示されるまで文章を表示しません。基本的には、引用符をもう一度表示する前に、配列全体をループする必要があります。ファイルの内容を配列に入れてシャッフルします。複数回出力しないでください。

​​
+0

表示先は誰ですか?どんな状況で? 1人のユーザー、またはすべてのユーザーのループスルー? – Problematic

+0

これは、各行に1つの文を含む単なるテキストファイルです。その文をエコーする必要があります。 –

+0

そして、すべての文章が表示されるまで要求ごとに1行を表示したい場合は、リストをランダム化して再開しますか?私はまだあなたが探しているものを正確に理解するために少し苦労しています。 – Problematic

答えて

0

これを行う簡単な方法は、毎回配列をシャッフルするのではなく、ランダムなインデックスを選択することです。次に、この索引をリストに保管します。これにより、既にこのインデックスを使用している場合は、次の関数呼び出しをチェックすることができます(ソートされたリストにそれらを格納する場合は、バイナリ検索などを使用して非常に高速にチェックできます)。インデックスの数がファイル内の行数と等しい場合は、その時点ですべてのインデックスが使用されているので、リストを破棄して新しいリストを開始することができます。

0

最初に重複する行を削除し、その結果を配列xに入れることができます。

次に、配列xから1つのランダム要素を選んで印刷し、2番目の配列(最初は空の配列)yに移動します。 配列xが空になるまで繰り返します。次に、配列yから配列xまでの要素 をすべて最初からやり直すことができます。

1

シャッフルはあなたの配列の複製を作成しないので、このコードはうまく動作します:

<?php 
$list = array(1,2,3,4,5,6); 
shuffle($list); 
print_r($list); 
?> 

Array 
(
    [0] => 2 
    [1] => 3 
    [2] => 6 
    [3] => 4 
    [4] => 1 
    [5] => 5 
) 

あなたは、ファイル内の重複行を持っていることを意味します。一意の値を持つ配列を取得する場合は、次のようにします。$unique = array_unique($list);

<?php 
$list = array(1,1,2,2,3,3); 
$unique = array_unique($list); 
shuffle($unique); 
print_r($unique); 
?> 


Array 
(
    [0] => 3 
    [1] => 2 
    [2] => 1 
) 
関連する問題