【问题标题】:How to use PHP Arrays to receive random numbers with no duplicating如何使用 PHP 数组接收不重复的随机数
【发布时间】:2017-09-22 03:19:47
【问题描述】:

由于我的网站没有上线,我无法提供 HTML。虽然我从理论编码中知道,专业人士希望能够遵循我的逻辑。

  • 如我所见,请用我的代码指出如何使它工作 以下链接类似但不完全相同的场景。我很困惑如何将它应用到我的以下代码中:

Generating random numbers without repeats

我的目标 我想使用 PHP 创建以下内容:

  1. 将 00 到 99 放入一个数组中。
  2. 从数组中检索一个随机数。
  3. 存储/使用从数组中检索到的随机数以放置在 mysql_query 中,如 number = $question 所示(此处我真的需要 ORDER BY RAND() 吗?)
  4. 从数字数组列表中删除选定的随机数
  5. 获取并显示随机数
  6. 使用完所有号码后,会显示一条错误消息,提示刷新页面以重置号码。

下次我想要另一个随机数时,它不能复制之前从数组中选择的相同随机数。所以如果我使用上面的代码说 109 次,那么数组中只剩下 1 个数字。

代码已编辑):

   <?php

  //--------------------------------------------------------------------------
  // Example php script for fetching data from mysql database
  //--------------------------------------------------------------------------
  $host = "localhost";
  $user = "root";
  $pass = "";

  $databaseName = "monkeyscanfly";
  $tableName = "num_image";

  //--------------------------------------------------------------------------
  // 1) Connect to mysql database
  //--------------------------------------------------------------------------
  include 'DB.php';
  $con = mysql_connect($host,$user,$pass);
  $dbs = mysql_select_db($databaseName, $con);

    if(!isset($_SESSION)) {
        session_start();

        $_SESSSION['used'] = [];
    }

    $array = [0,1,2,3,4,5,6,7,8,9,"00","01","02","03","04","05","06","07","08","09",10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]; 

    while(!empty($array)) {
        $array = array_diff($array, $_SESSSION['used']);

        //pick a random point from the array
        $random = array_rand($array);

        // Save the used element in session
        $_SESSION['used'][] = $array;


        //store the random question number
        $question = $array[$random];

        // Select information from database and use array to assign to the selected row.

        $query = mysql_query("SELECT number, association, image_file, skeleton, sound, colour, comments FROM num_image WHERE number = $question ORDER BY RAND() LIMIT 1");

        // Remove random number that was chosen from the array, so the next time the random number is ran, it won't be found in the array.

        unset($array[$random]);

        //fetch result to print on page

        $arrayss = mysql_fetch_row($query);

        //Echo result as json
        echo json_encode($arrayss);
    }

    if(count($array) == count($_SESSION['used'])) {
        $_SESSION['used'] = [];
    }
?>

我希望这是有道理的,我很难找到如何去做,我已经搜索了几个小时并且无法理解它。 :)

我忘了说每次我需要一个新的随机数时,这个 PHP 脚本都会被 ajax 代码重新加载。所以它必须记住这一点来存储/记住数字。如果这有意义?

【问题讨论】:

  • 你不应该再使用 mysql_* 函数了,它们在 PHP 5.x 中被弃用了很长时间,在 PHP 7.x 中被完全删除。如果您希望您的代码面向未来,您必须使用不同的 SQL API,例如 mysqli 或 PDO
  • @GordonM 我知道,但不幸的是,这是我目前必须使用的。当我重新开发整个项目的其余部分时,我会考虑 PHP 7.x。
  • @aussiedan 双重工作,不是很省时,为什么不从使用 PHP 7 开始?
  • @Script47 因为在过去的几年里我已经花了几个月的时间来构建这个网站哈哈。在我的下一个项目中,我将使用 PHP 7。

标签: php arrays random mt


【解决方案1】:

如果我理解正确,我认为这段代码就是你要找的。在这种情况下,由于您使用的是 AJAX,我们将在会话中保存使用过的问题,例如数组。

<?php
    if(!isset($_SESSION)) {
        session_start();

        $_SESSION['used'] = ((!isset($_SESSION['used'])) ? ([]) : ($_SESSION['used']));
    }

    //--------------------------------------------------------------------------
    // 1) Connect to mysql database
    //--------------------------------------------------------------------------
    include 'DB.php';

    $con = mysql_connect($host, $user, $pass);
    $dbs = mysql_select_db($databaseName, $con);

    $array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99];
    $array_unique = [];

    while(!empty($array_unique = array_diff($array, $_SESSION['used']))) {
        //pick a random point from the array
        $random = array_rand($array_unique, 1);

        // Save the used element in session
        $_SESSION['used'][] = $array_unique[$random];

        //store the random question number
        $question = $array_unique[$random];

        // Select information from database and use array to assign to the selected row.
        $query = mysql_query("SELECT `number`,`association`,`image_file`,`skeleton`,`sound`,`colour`,`comments` FROM ".$tableName." WHERE `number` = ".$question." LIMIT 0,1");

        //fetch result to print on page

        $row = mysql_fetch_row($query);

        //Echo result as json
        echo json_encode($row);
    }
    if(count($array_unique) == 0) {
        $_SESSION['used'] = [];
    }
?>

只需使用whilearray_rand

【讨论】:

  • 谢谢 b0ne,我试过了,但我仍然重复。我认为这是因为我使用 ajax 来调用带有 php 的页面?那么这会杀死数组并每次重新加载它,从而在加载时不断重置数组吗?
  • 不客气,现在就用更新的代码试试吧。
  • 我已经更新了上面的代码,现在根本没有显示任何内容。也许调用数据库正在杀死它?但我需要调用它来获取数据库中的信息。
  • 立即尝试。
  • 似乎 `while(!empty($array)) { ` 会导致问题,因为它什么也没显示,当我从包含尾随 ` } 的代码中删除它时,它会运行,但仍然似乎显示重复但不那么频繁。但由于它显示重复,我认为这意味着它正在跳过您创建的代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 2011-05-13
  • 1970-01-01
  • 2021-04-01
  • 2016-05-05
  • 2014-05-18
相关资源
最近更新 更多