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 はローカル変数であるため、そのスコープ内には常にバックアップのインスタンスが 1 つ含まれているため、想定どおりの動作はしません。インクリメントをポストする $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 に答える