php函数循环,最后返回处理后的数组

时间:2018-08-10 05:43:34

标签: php arrays

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,1 => 4],但收到[0 => 1,1 => 2]

有人可以解释它如何返回吗?

4 个答案:

答案 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)

您需要将返回值分配给$arr

$arr = test(3,4);

Live demo