php - 随机播放函数不随机播放数组元素 (PHP)

标签 php arrays

我正在通过阅读一本书来学习 PHP。我意识到 PHP 的内置 shuffle() 函数会在洗牌时破坏键值关联。所以我决定编写自己的改组函数,它会保留原始数组键,但会将它们映射到不同的值(我认为这有多难)?一个小时后,我仍然无法使该功能正常工作,所以我决定最好认输并寻求帮助。我会概述该函数的(最终版本),然后解释我到目前为止所做的尝试。


我的代码

<?
    function swap(&$a, &$b)
    {
        $tmp = $a;
        $a = $b;
        $b = $tmp;
    }

    function shuffleX($arr) #Shuffles the key-value associations in an array.
    {
        $keys = array_keys($arr);   #extract the keys from the array.
        $length = count($keys);
        $i = 0; #Index.
        while ($i < $length-1) 
        {
            $target = rand(($i+1), $length-1);  #This ensures that no value ends up mapped to the same key.
            swap($arr[$keys[$i]], $arr[$keys[$target]]);    #Swap each element of the array with another.
            $i++;
        }
    }
?>

我用于测试目的的数组是:$statesX = ["CA"=> "California", "NY"=> "New York", "FL"=> "Florida", "WA"=> "华盛顿"];
我在 PHP 交互式 shell 中测试了这个函数(shuffleX() 已重命名,因为我无法重新定义已经定义的函数,所以我在编辑某些内容时复制粘贴并更改名称):
enter image description here


我解决问题的尝试(不一定按时间顺序排列)

  • 我确认交换正在工作,并且它确实交换了关联数组的键值关联:
    enter image description here

  • 我确认 array_keys() 返回数组的键:
    enter image description here

  • 我确认我可以使用 array_keys() 访问数组元素:
    enter image description here

  • 我确认 rand() 可以为小尺寸数组生成随机值:
    enter image description here

在这一点上,我决定我花了太多时间仔细阅读我的代码,我应该寻求帮助。

最佳答案

您的 shuffleX 函数按值接受数组。为了让调用者看到它的修改,它需要通过引用接受数组:function shuffleX(&$arr)

关于php - 随机播放函数不随机播放数组元素 (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54016119/

相关文章:

php - 检查多个字符串是否为空

arrays - 在 foldLeft 中递增变量

java - 在 Java 中制作通用列表的二维数组

php - Yii2 上的 GridView : How to freeze header (i. e.,有一个固定的标题行)

php - Laravel 5.1-实时网站上的错误 View ,哪一个或所有一个以及如何实现?

javascript - 在 extJS 中将数组转换为 JSON

javascript - 如何确定对象中的任何数组是否有条目

c# - 将 C# 数组与自身进行比较

php - 是否应该在没有占位符的情况下使用准备好的语句

php - 从 php 文件中删除特定行