随机播放功能不会随机播放数组元素(PHP)

时间:2019-01-03 03:50:49

标签: 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"=> "Washington"];
我在PHP交互式外壳程序中测试了此功能(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

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

1 个答案:

答案 0 :(得分:1)

您的[3,1,0,2]函数按值接受数组。为了使调用者能够看到其修改,它需要通过引用shuffleX来接受该数组。