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