function test($a, $b){
$arr = [$a, $b];
if($a == 1){
echo "first here";
test(3,4);
}
else{
echo "second here";
return [$a, $b];
}
echo "should have returned earlier";
return $arr;
}
$arr = test(1,2);
print_r($arr);
有人可以解释它如何返回吗?
答案 0 :(得分:3)
在处理递归时,您应该返回一个递归函数。
function test($a, $b){
$arr = [$a, $b];
if ($a === 1) {
echo "first here";
return test(3,4);
}
// ELSE is not needed as if $a === 1 the program will never get here
echo "second here";
return [$a, $b];
}
$arr = test(1,2);
print_r($arr);
请考虑通过精确指定所需的输出和行为来更新您的问题。如果我为您创建的代码不是您想要的结果,那么您还应该考虑更改代码,因为它不是动态的,并且可能没有用例。
答案 1 :(得分:2)
这是您的代码注释:
function test($a, $b){
$arr = [$a, $b];
if($a == 1){
echo "first here";
test(3,4); // Return value from recursive call discarded
}
else{
echo "second here";
return [$a, $b]; // if $a != 1, will return here
}
echo "should have returned earlier";
return $arr; // if $a == 1, will always return here
}
如果遵循所有可能的路径,您会发现该函数始终返回[$a, $b]
,因为test(3,4)
的返回值将立即被丢弃,并且该函数继续。
要获得期望的输出,需要进行以下更改:
- test(3,4);
+ return test(3,4);
此时,您不需要最后两行,因为if
的两个分支都将返回:
- echo "should have returned earlier";
- return $arr;
现在不使用$arr
,因此也可以将其删除:
- $arr = [$a, $b];
-
这给出了:
function test($a, $b) {
if ($a == 1) {
echo "first here";
return test(3, 4);
}
else {
echo "second here";
return [$a, $b];
}
}
但是,有些人不喜欢多个return
/早期return
。您可以改用以下代码:
function test($a, $b) {
if ($a == 1) {
echo "first here";
$arr = test(3, 4);
}
else {
echo "second here";
$arr = [$a, $b];
}
return $arr;
}
考虑像我所做的那样添加额外的空格以提高可读性。如果您的函数仅应使用整数,请考虑使用===
而不是==
。我还建议使用代码覆盖率良好的单元测试框架。这样一来,您可以查看执行了哪些行(但不执行顺序),这将有助于您查找,理解和修复错误。
答案 2 :(得分:1)
您绝不会尝试返回3, 4
。您可以通过代码中的test(3,4)
对其进行调用,该代码将“返回”该值,但是您实际上并没有对其进行任何操作,只需调用它即可。您的代码继续运行,然后返回$arr
,它是最初传入的[1, 2]
。
您可以通过查看test(3,4)
的返回值来看到这一点:
<?php
function test($a, $b){
$arr = [$a, $b];
if($a == 1){
echo "first here";
// Put the return of test(3,4) into $ret
$ret = test(3,4);
print_r($ret);
}
else{
echo "second here";
return [$a, $b];
}
echo "should have returned earlier";
return $arr;
}
$arr = test(1,2);
print_r($arr);
请记住,$a
和$b
永远不会被覆盖。每个变量都存在于运行它的函数中,然后不再存在。这就是使功能的重用性如此重要的原因。
答案 3 :(得分:0)