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();?>

随机小部件();输出一个 URL,然后我在 include 函数中使用它来显示小部件。

代码在 6 个 php 文件中随机选择并随机显示一个。我将它包含 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作为可选的第二个参数,它指定要选择的条目数。因此,将此参数添加到random_widget,将其传递给以array_rand获取键数组而不是单个键,返回文件数组,然后遍历该数组以包含小部件(而不是调用random_widget三次)。

<?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 回答