洗牌功能没有';t洗牌数组元素(PHP)

洗牌功能没有';t洗牌数组元素(PHP),php,arrays,Php,Arrays,我通过阅读一本书来学习PHP。我意识到PHP内置的shuffle()函数在洗牌时会破坏键值关联。因此,我决定编写自己的洗牌函数,保留原始数组键,但将它们映射到不同的值(我认为这有多难)?一个小时后,我仍然无法使该功能正常工作,因此我决定最好就此认输并寻求帮助。我将概述函数的(最终版本),然后解释到目前为止我尝试了什么 我的代码 我用于测试目的的数组是:$statesX=[“CA”=>“California”,“NY”=>“New York”,“FL”=>“Florida”,“WA”=>“W

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


我的代码

我用于测试目的的数组是:
$statesX=[“CA”=>“California”,“NY”=>“New York”,“FL”=>“Florida”,“WA”=>“Washington”]
我在PHP交互式shell中测试了此函数(
shuffleX()
被重命名,因为我无法重新定义已定义的函数,所以每当我编辑某些内容时,我都会复制粘贴并更改名称):


我解决问题的尝试(不一定按时间顺序)
  • 我确认swap正在工作,它确实为关联数组交换键值关联:

  • 我确认
    array\u keys()
    返回数组的键:

  • 我确认可以使用
    array\u keys()

    访问数组元素

  • 我确认,
    rand()
    即使对于较小的数组也能产生随机值:


此时,我决定花太多时间阅读代码,应该寻求帮助。

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

<?
    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++;
        }
    }
?>