15

私はそれを正しく行うことを確認したいだけであり、これにより競合が発生することはありません.

私は自分自身を呼び出す機能を持っていますが、あなたの承認が必要ですか?

<?php

function determine($the_array){
    foreach ($the_array as $key => $value) {
        switch ($key) {
            case 'in':
                    echo $value;
                break;

            case 'out':
                    echo $value;
                break;

            case 'level':
                    echo '<ul>';
                    determine($value);
                    echo '</ul>';
                break;

        }
    }

}

これは配列です:

$the_array = array(
    'in' => '<li>Simple IN</li>',
    'out' => '<li>Simple OUT</li>',
    'level' => array(
            'in' => '<li>Simple IN 2</li>',
            'out' => '<li>Simple OUT 2</li>',
            'level' => array(
                'in' => '<li>Simple IN 3</li>',
                'out' => '<li>Simple OUT 3</li>'
            ),
        ),
);

そして、ここに最終的な初期化があります:

echo '<ul>';
determine($the_array);
echo '</ul>';

結果はまさに私が望んでいた方法であり、うまく機能しますが、これが良い習慣であるかどうかはわかりません.

4

4 に答える 4

44

再帰関数は問題ありませんが、何をしているのかよくわからない場合は危険です。関数が再帰ループ (何度も何度も自分自身を呼び出し続ける) に陥る可能性がある場合は、タイムアウトになるか、メモリが不足するか、ゾンビの黙示録が発生します。

再帰呼び出しは、非常に鋭いナイフと考えてください。経験豊富なシェフの手の中で、それは天国で行われた試合であり、食器洗い機の手の中で、それは起こるのを待っている失われた指です.

PHP はうまくやろうとし、再帰の深さをデフォルトで 100 に制限します (ただし、これは変更できます) が、ほとんどすべての場合、再帰の深さが 100 に達した場合、事故はすでに発生しており、PHP は追加の歩行者を停止させることで反応します。渋滞に迷い込む。:)

于 2013-09-05T11:14:08.880 に答える
3

Fluffeh は、再帰関数に関する限り、十分な答えを提供してくれました。しかし、大きな配列/オブジェクト/などで再帰を使用する場合は、コードの最適化を監視して、実行に多くのメモリや CPU パワーを消費しないようにする必要があります。

コードを簡単に最適化して、コードをよりクリーンにし、メモリ使用量を減らし、予期しないデータに対する回復力を高めることができます。関数の引数リストの & に注意してください (ネストされた関数が呼び出されるたびに配列のコピーを作成する必要がなくなります)。

function determine(& $the_array){
foreach ($the_array as $key => $value) {
    switch ($key) {
        case 'in':
        case 'out':
                echo $value;
            break;

        case 'level':
            if (!is_array($value)) break;
                echo '<ul>';
                determine($value);
                echo '</ul>';
            break;

        }
    }
}
于 2013-09-05T11:30:07.653 に答える