由 unset() 和 print_r() 处理的数组要么完好无损,要么什么都没有

Array handled by unset() and print_r() is either intact or somehow becomes nothing

下面的 PHP 代码从数组中随机选择一种颜色。如果随机选择的颜色是蓝色,它returns数组;如果随机选择的颜色不是蓝色,它会删除该颜色并递归执行该函数,直到它随机选择蓝色和 returns 数组。

$reduce_unwanted_colors = function (&$arr) use (&$reduce_unwanted_colors)
{
    $rand_key = array_rand($arr);
    if ($arr[$rand_key] == 'blue')
    {
        return $arr;
    }
    else
    {
        unset($arr[$rand_key]);
        $reduce_unwanted_colors($arr);
    }
};

$arr = ['red', 'green', 'blue', 'orange', 'yellow'];
print_r($reduce_unwanted_colors($arr));

奇怪的是,print_r() 要么显示完整的数组,要么什么都不显示(可能是空字符串?)。

我不确定 unset() 是否不小心删除了所有数组元素。即使是,我认为 print_r() 仍应显示 Array ( ) 而不是什么都不显示。

我对 print_r() 的期望是一个至少包含一个元素(蓝色)的数组。我不知道发生了什么事。

请注意,代码只是一个示例,只是为了便于说明。

如果您没有 return else 语句中的任何内容,它将简单地递归执行,但实际上 return 不会执行任何内容。您还必须记住 return 来自对 $reduce_unwanted_colors 的递归调用的值:

$reduce_unwanted_colors = function (&$arr) use (&$reduce_unwanted_colors)
{
    $rand_key = array_rand($arr);
    if ($arr[$rand_key] == 'blue')
    {
        return $arr;
    }
    else
    {
        unset($arr[$rand_key]);
        return $reduce_unwanted_colors($arr);
    }
};

$arr = ['red', 'green', 'blue', 'orange', 'yellow'];
print_r($reduce_unwanted_colors($arr));

需要注意的是,通过引用在此处传递 $arr 是不需要的(除非您确实想修改原始数组)。就我个人而言,我建议不要这样做,因为您实际上是在 returning 它,因此修改它并 returning 它,似乎它可能会导致其他开发人员在调查该应用程序时出现意外行为。

您可以看到一些示例输出 here.

由于您通过引用传递 $arr,因此您不需要 return 函数中的任何内容;修改正文中的数组就足够了。这也意味着您在找到 blue 元素时无需执行任何操作;当当前元素不是 blue.

时递归
$reduce_unwanted_colors = function (&$arr) use (&$reduce_unwanted_colors)
{
    $rand_key = array_rand($arr);
    if ($arr[$rand_key] != 'blue') {
        unset($arr[$rand_key]);
        $reduce_unwanted_colors($arr);
    }
};

$arr = ['red', 'green', 'blue', 'orange', 'yellow'];
$reduce_unwanted_colors($arr);
print_r($arr);

3v4l.org

上大量随机输出的演示

工作正常:

<?php

$reduce_unwanted_colors = function (&$arr) use (&$reduce_unwanted_colors)
{
$rand_key = array_rand($arr);
if ($arr[$rand_key] == 'blue')
{
    return $arr;
}
else
{

     unset($arr[$rand_key]);
    return $arr;
}
};

$arr = ['red', 'green', 'blue', 'orange', 'yellow'];
print_r($reduce_unwanted_colors($arr));

?>