由 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);
上大量随机输出的演示
工作正常:
<?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));
?>
下面的 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);
上大量随机输出的演示
工作正常:
<?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));
?>