PHP无限循环,为什么?

时间:2017-09-28 21:53:42

标签: php loops

这是我的代码。我不明白为什么我会无休止地循环。 我认为当我为我的数组创建唯一的随机值时,$ check必须停止循环。

    <?php

        $foo["blue"] = 0;
        $foo["black"] = 0;
        $foo["red"] = 0;
        $foo["white"] = 0;

        $check;
        do
        {
            foreach($foo as &$val)
            {
                $val = rand(1,6);
            }

            $foo = array_unique($foo);
            $check = count($foo);

        }
        while($check != 4);

        echo '............................ <br>';
        foreach($foo as $key=>$value)
        {
            echo $key . ' ' . $value . '<br>';
        }

    ?>

2 个答案:

答案 0 :(得分:1)

问题是第一次循环时有一些重复,所以array_unique()将数组从4个元素减少到1,2或3. foreach循环永远不能生成数组再次变大,因为它只循环遍历数组中当前存在的元素。因此,一旦数组缩小,它将永远不会增长回4个元素,$check != 4将始终为真。

你应该获得数组的原始密钥并使用它。

<?php

    $foo["blue"] = 0;
    $foo["black"] = 0;
    $foo["red"] = 0;
    $foo["white"] = 0;
    $keys = array_keys($foo);

    $check;
    do
    {
        foreach($keys as $i)
        {
            $foo[$i] = rand(1,6);
        }

        $foo = array_unique($foo);
        $check = count($foo);

    }
    while($check != 4);

    echo '............................ <br>';
    foreach($foo as $key=>$value)
    {
        echo $key . ' ' . $value . '<br>';
    }

?>

DEMO

答案 1 :(得分:0)

就个人而言,我不会在具有如此低熵的循环中进行,因为它可能需要一整天才能最终匹配随机集。

更好的方法是生成一个范围并随机化,然后循环遍历数组并设置值。

<?php
$rand = range(1, 6);
shuffle($rand);

$foo["blue"] = 0;
$foo["black"] = 0;
$foo["red"] = 0;
$foo["white"] = 0;

$i=0;
foreach ($foo as $key => $value) {
    $foo[$key] = $rand[$i];
    $i++;
}

print_r($foo);
/*Array
(
    [blue] => 1
    [black] => 3
    [red] => 2
    [white] => 5
)
*/

https://3v4l.org/4hPku