【问题标题】:PHP .rand function,PHP .rand 函数,
【发布时间】:2013-06-24 20:57:15
【问题描述】:

我的php知识有限,如果答案很明显,请见谅。

单击链接时,我正在使用 .rand 函数显示来自 3 个页面之一的随机图像。这些页面都命名相同并且位于不同的文件夹(页面、媒体、文本)中。我遇到的问题是我每次都想要组合 3 个不同的页面/图像,但每次都以相同的 3 个页面/图像组合出现。 我要这个 例如 第 1 页,媒体 2,文本 1。下一个... 第 3 页,媒体 2,文本 3。下一个... 第 1 页,媒体 3,文本 2。

相反,它出来了 例如 第 1 页,媒体 1,文本 1。下一个... 第 3 页、媒体 3、文本 3。下一个... Page2、Media2、Text2。

解决方案可能很简单,但我似乎无法弄清楚。

这是我的代码:

<body>
<div id="wrapper">
  <div id="click"><a href="index.php?p=<?php echo 'include-'.rand(1,3); ?>">CLICK HERE</a>></div>
  <div id="content">
    <?php 
    if (!empty($_GET['p'])) {
        $pages_dir = 'pages';
        $pages = scandir($pages_dir, 0);
        unset($pages[0], $pages[1]);

        $p = $_GET['p'];

        if (in_array($p.'.inc.php',$pages)) {
            include($pages_dir.'/'.$p.'.inc.php');
        }   else {
            echo 'Sorry, page not found.';
        }
  } 
  ?>
  </div>
  <div id="content2">
    <?php
    if (!empty($_GET['p'])) {
        $media_dir = 'media';
        $media = scandir($media_dir, 0);
        unset($media[0], $media[1]);

        $p = $_GET['p'];

        if (in_array($p.'.inc.php',$media)) {
            include($media_dir.'/'.$p.'.inc.php');
        }   else {
            echo 'Sorry, page not found.';
        }
  } 
  ?>
  </div>
   <div id="content3">
    <?php
    if (!empty($_GET['p'])) {
        $text_dir = 'text';
        $text = scandir($text_dir, 0);
        unset($text[0], $text[1]);

        $p = $_GET['p'];

        if (in_array($p.'.inc.php',$text)) {
            include($text_dir.'/'.$p.'.inc.php');
        }   else {
            echo 'Sorry, page not found.';
        }
  } 
  ?>
  </div>
</div>
</body>

【问题讨论】:

  • 这可以用一个循环和一个函数来简化,但你的问题是你只生成一次随机数,你需要为 3 个部分中的每一个做一次

标签: php


【解决方案1】:

您只使用过一次函数“rand()”,因此您将只有一个随机数。如果您想要更多数字,请多次使用该功能。例如:

$rnd_1 = rand(0,3);
$rnd_2 = rand(0,3);
$rnd_3 = rand(0,3);

他们每个人都可能产生一个唯一的数字;)

【讨论】:

  • 使用mt_rand() 而不是rand()。它会生成更好的随机数。
  • @SverriM.Olsen 你真的认为这种用法需要一个“更好”的随机数吗?
  • @Dagon 我主要提到它只是为了说明有一个更好的随机数生成器。对于这个用例,使用哪个函数可能没有区别,但是当有两个或更多的东西可供选择时,使用更好的一个是有意义的。
【解决方案2】:

你在这里只使用一次 rand:

<a href="index.php?p=<?php echo 'include-'.rand(1,3); ?>">

有两种解决方案:

  • 不要使用 rand 作为 GET 参数,只在设置 $_GET['p'] 时生成随机数。

  • 再创建两个 GET 参数,例如。 $_GET['m'] 用于媒体,$_GET['c'] 用于内容并用它们替换 $_GET['p']。

【讨论】:

    【解决方案3】:

    尝试使用shuffle(glob('*.png'));,或仅使用shuffle(); 一组图片。 见:

    http://php.net/manual/en/function.glob.php

    http://php.net/manual/en/function.shuffle.php

    glob 中的字符串可以替换为任何文件扩展名。

    您的代码可能如下所示:

    $allPics = shuffle(glob('*png')); $pic = array_slice($allPics, 0, 3);
    

    现在$pic[0]$pic[1]$pic[2] 保留您的图片。

    就我个人而言,如果您只是想返回 3 张图片,我认为您应该使用 JavaScript。该代码看起来像这样:

    首先是外部 picloader.js 文件:

    //+ Jonas Raoni Soares Silva - Google
    //@ http://jsfromhell.com/array/shuffle [v1.0]
    function shuffle(o){ //v1.0
      for(var j,x,i=o.length; i; j=parseInt(Math.random()*i),x=o[--i],o[i]=o[j],o[j]=x);
        return o;
    }
    //everything else by Jason Raymond Buckley
    function E(e){
      return document.getElementById(e);
    }
    function picLoader(clickId, outIdsArray, imageArray){
      E(clickId).onclick = function(){
        var oa = outIdsArray, il = oa.length, sh = shuffle(imageArray), pic = sh.slice(0, il);
        for(var i in oa){
          E(oa[i]).innerHTML = "<img src='"+pic[i]+"' />";
        }
      }
    }
    

    您页面上的代码现在应该如下所示:

    <body>
      <div id="wrapper">
        <input type='button' value='CLICK HERE' id='showPics' />
        <div id="content"></div>
        <div id="content2"></div>
        <div id="content3"></div>
      </div>
      <script type='text/javascript' src='picloader.js'></script>
      <script type='text/javascript'>
        var imageArray = ['img1.png', 'img2.png', 'img3.png', 'img4.png', 'img5.png', 'img6.jpg', 'img7.jpg'];
        picLoader('showPics', ['content', 'content1', 'content2'], imageArray);
      </script>
    </body>
    </html>
    

    这应该适用于任意数量的输出元素,只要 imageArray 至少与包含输出内容 ID 的数组一样长。

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 2018-10-20
      • 2014-02-21
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多