0
function createUniqueName($name, $i = 0)
{
    $names = array('backup');

    if($i != 0) {
        $newname = $name.'-'.$i;
    } else {
        $newname = $name;
    }

    if(in_array($newname, $names)) {
        $newname = createUniqueName($name, $i++);
    }

    return $newname;
}

echo createUniqueName('backup', 0);

不幸的是,这会导致内存泄漏,我不知道为什么。它是一个正常的递归。有任何想法吗?

收到的错误是:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 130968 bytes) in /Users/Tim/Sites/tests/uniquename.php on line 16
4

2 回答 2

2

这段代码会导致函数无限期地运行,它也不会像你想象的那样做,因为 $names 是一个局部变量,所以在这个范围内它总是包含一个备份实例。当您执行 $i++ 后增量时,您应该执行 ++$i 以便值在进入函数调用之前实际更改。否则您总是将 0 传递给函数。

createUniqueName($name, $i++); 

意思是“在我运行 createUniqueName($name, $i) 后增加 $i。”

如果您将其更改为

 createUniqueName($name, ++$i); 

您将更接近预期的行为(递归不会是无限的)。

我将把变量范围的问题留给你,作为一个练习来弄清楚它的去向。

于 2012-09-06T17:26:23.873 回答
0
$newname = createUniqueName($name, $i++);

$i++是后增量,即在进行递归调用后它会增加变量。

因此递归是无限的,因为它总是用相同的参数调用函数。

于 2012-09-06T17:29:07.180 回答