2013-09-05 18 views
9

私は正しいことを確認したいと思います。再帰関数:PHP関数自体を呼び出す

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

<?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>' 
      ), 
     ), 
); 

そしてここでは、最終のinitです:

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

結果は私がなりたかっただけの方法です、それは素晴らしい作品が、私ドンこれが良い習慣であるかどうかは分かりません。

答えて

26

再帰関数はOKですが、何をしているのかわからない場合は危険です。関数が再帰的ループ(何度も何度も繰り返し呼び出される)で終了する可能性がある場合は、タイムアウトするか、メモリが足りなくなるか、ゾンビの黙示録を引き起こします。

経験豊富なシェフの手で再帰呼び出しを考える - 食器洗い機の手の中で天国で行われた試合で、それは起こるのを待っている失われた指です。

PHPはniceを再生しようとしますが、デフォルトでは再帰深度を100に制限します(これは変更可能ですが)。ほとんどの場合、再帰深度が100になると事故は起こり、PHPは停止します追加の歩行者が交通に迷うことはありません。 :)

+2

以下:再帰関数は悪いことではありません。 :) – Virus721

+1

@ Virus721あなたが何をしているのかわからない場合は、悪い練習です。 – Fluffeh

+1

この場合の悪い練習は、あなたがしていることを知らないことです。再帰関数。 – Virus721

3

Fluffehは、再帰関数に関しては十分な答えを出しました。しかし、大規模な配列/オブジェクト/ etcで再帰を使用する場合は、コードの最適化を監視して、実行するメモリや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; 

     } 
    } 
} 
0

私はあなたが、配列の深さを知っていれば、それは良い解決策だ場合、私は、知らないが、私は自分自身の内側から機能を呼び出すために、このいずれかを使用

$list = ""; 
foreach ($the_array as $array) { 
    if(is_array($array)) { 
     foreach($array as $sub_array) { 
      if(is_array($sub_array)) { 
       foreach($sub_array as $sub_array_2) { 
        $list .= "$sub_array_2"; 
       } 
      } else { 
      $list .= "$sub_array"; 
      } 
     } 
    } else { 
     $list .= "$array"; 
    } 
} 

echo "<ul>$list</ul>"; 
1

を使用することが良いと思います。

function my_calucar(){ 
    $arrayy= array('mine' => '1', 'yours' => '24', 'her' => '34'); 
    foreach ($arrayy as $each=>$value) { 
     switch ($each) { 
     default: 
       my_calucar($value); 
     } 
    } 
} 
関連する問題