【问题标题】:PHP - Displaying random output more than once, prevent duplicatePHP - 多次显示随机输出,防止重复
【发布时间】:2012-06-28 10:26:31
【问题描述】:

我有以下代码用于从文件夹中随机显示 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 文件中随机选择并随机显示一个。我将其包含 3 次以获得 3 个小部件。但是,有时我会多次显示相同的小部件。

我可以做些什么来修改代码以防止这种情况发生?

【问题讨论】:

    标签: php arrays random include


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 这段代码报错。解析错误:语法错误,第 4 行出现意外的 '(',期待 ',' 或 ';'
    • 更新了代码,忘了PHP中的静态变量不能用表达式初始化。现在应该可以正常工作了。
    【解决方案2】:

    在页面开头声明文件$files = glob($dir . '/*.*'); 在 random_widget 中,拉取值后执行 unset($files[$file])

    【讨论】:

    • 如果你尝试这个方法,别忘了用global $files;把$files拉到函数的命名空间中
    • 是的,虽然静态变量实际上会更好。
    【解决方案3】:

    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

    【讨论】:

    • 我喜欢一个函数调用来获得尽可能多的小部件的想法 - 但是,这只有在所有小部件都放在一个位置时才有效。我的解决方案允许从任何地方调用 random_widget() 而不用大惊小怪。
    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2012-12-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    相关资源
    最近更新 更多