0

フォルダーから PHP ウィジェットをランダムに表示するために使用している次のコードがあります。

<?php 
function random_widget($dir = 'wp-content/themes/zonza/elements')
{
    $files = glob($dir . '/*.*');
    $file = array_rand($files);
    return $files[$file];
}
?>

<?php include random_widget();?>
<?php include random_widget();?>
<?php include random_widget();?>

random_widget(); URL を出力し、それを include 関数で使用してウィジェットを表示します。

コードは 6 つの php ファイルからランダムに選択し、ランダムに 1 つを表示します。3つのウィジェットを取得するために3回含めます。ただし、同じウィジェットが複数回表示されることがあります。

これが起こらないようにコードを変更するにはどうすればよいですか?

4

3 に答える 3

2

これを試して:

<?php 
function random_widget($dir = 'wp-content/themes/zonza/elements')
{
    static $files = false;
    if(!$files) $files=glob($dir . '/*.*');
    $key = array_rand($files);
    $file=$files[$key];
    unset($files[$key]);
    return $file;
}
?>

$files から返されたファイルを削除し、複数の関数呼び出しで $files を維持することで機能します (最初に関数を呼び出したときにのみ globs() を呼び出します)。

于 2012-06-27T02:32:11.223 に答える
0

ページの先頭でファイルを宣言する$files = glob($dir . '/*.*'); random_widget ではunset($files[$file])、値を取得した後にこれを行います。

于 2012-06-27T02:32:50.773 に答える
0

array_rand$num_req選択するエントリの数を指定するオプションの 2 番目のパラメータとして数値を取ります。したがって、このパラメータを に追加しrandom_widget、 に渡してarray_rand単一のキーではなくキーの配列を取得し、ファイルの配列を返し、この配列を繰り返し処理してウィジェットを含めます ( random_widget3 回呼び出す代わりに)。

<?php 
function random_widget($num_req, $dir = 'wp-content/themes/zonza/elements')
{
    $files = glob($dir . '/*.*');
    $keys = array_rand($files, $num_req);

    $chosen = array();

    foreach($keys as $key) {
        $chosen[] = $files[$key];
    }

    return $chosen;
}

$widgets = random_widget(3);
foreach($widgets as $widget) {
    include $widget;
}

?>

他の回答で提案されているソリューションに対するこのソリューションの利点は、ステートレスであることです。さまざまなコンテキストで必要なだけ関数を再利用できます。

ソース: http://php.net/manual/en/function.array-rand.php

于 2012-06-27T02:34:57.920 に答える