2

私のphpスクリプトには、さまざまな数の要素を持つ可能性のある配列を含む変数 $data があります。

スクリプトは、配列要素の 1 つをランダムに選択し、ブラウザーに出力します。

# count number of elements in $data
$n = count($data);

# pick a random number out of the number of elements in $data
$rand = rand(0, ($n - 1));

# output a random element
echo '<p> . trim($data[$rand]) . '</p>';

質問: そのスクリプトを改善して、配列要素がなくなるまで同じ配列要素を再度出力しないようにしたいと考えています。たとえば、配列に 0 から 9 までの番号が付けられた要素が含まれていて、スクリプトが配列要素 #4 を選択した場合、それを覚えておき、次にスクリプトを実行するときに #4 の要素を除外する必要があります。

おそらくさまざまな方法で実行できますが、私は最も単純で最も洗練されたソリューションを探しており、PHP の専門家からの助けに感謝しています。

4

4 に答える 4

2

配列をシャッフルしてから、単純に反復することができます。

shuffle($data);
foreach ($data as $elem) {
    // …
}

配列の順序を変更したくない場合は、配列のキーを単純にシャッフルできます。

$keys = array_keys($data);
shuffle($keys);
foreach ($keys as $key) {
    // $data[$key]
}
于 2013-01-21T06:12:26.927 に答える
2

ユーザーのセッションで既に選択された番号を保存します。

session_start();
$n = count($data); 

// If the array isn't initialized, or we used all the numbers, reset the array
if( !isset( $_SESSION['used_nums']) || count( $_SESSION['used_nums']) == $n) {
    $_SESSION['used_nums'] = array();
}

do{ 
    $rand = rand(0, ($n - 1));
} while( isset( $_SESSION['used_nums'][$rand]));

echo '<p>' . trim($data[$rand]) . '</p>';    
$_SESSION['used_nums'][$rand] = 1;

または、おそらくより賢い方法で、 and を使用array_intersect_keyarray_randます。

session_start();
$n = count($data); 

// If the array isn't initialized, or we used all the numbers, reset the array
if( !isset( $_SESSION['used_nums']) || count( $_SESSION['used_nums']) == $n) {
    $_SESSION['used_nums'] = array();
}

$unused = array_intersect_key( $data, $_SESSION['used_nums'];
$rand = array_rand( $unused);

echo '<p>' . trim($unused[$rand]) . '</p>';    
$_SESSION['used_nums'][$rand] = 1;
于 2013-01-21T05:24:11.883 に答える
1

セッションを使用して、これまでに使用したインデックスを保存できます。これを試して。

session_start();

$used = &$_SESSION['usedIndexes'];

// used all of our array indexes
if(count($used) > count($data)) 
    $used = array();

// remove the used indexes from data
foreach($used as $index)
    unset($data[$index]);

$random = array_rand($data);

// append our new index to used indexes
$used[] = $random;

echo '<p>', trim($data[$random]) ,'</p>';
于 2013-01-21T05:24:26.597 に答える
0
$selection=$x[$randomNumber];
unset($x[$randomNumber]);
于 2013-01-21T05:22:23.980 に答える