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
答案 0 :(得分:2)
此代码导致函数无限期运行,也不会按照您的想法执行,因为$ names是一个局部变量,因此在该范围内它始终包含一个备份实例。当你做$ i ++后发布增量时,你应该做++ $ i,这样值实际上会在进入函数调用之前发生变化。否则你总是将0传递给函数。
createUniqueName($name, $i++);
表示“运行createUniqueName($ name,$ i)后,增加$ i。”
如果您将其更改为
createUniqueName($name, ++$i);
您将更接近预期的行为(递归不会是无限的)。
我将把变量范围问题留给你作为练习,找出它的位置。
答案 1 :(得分:0)
$newname = createUniqueName($name, $i++);
$i++
是后递增的,即它会在递归调用后递增变量。
因此递归是无限的,因为它总是用相同的参数调用函数。