递归函数:调用php函数本身

问题描述:

我只是想确保我做对了,这不会造成任何困惑。递归函数:调用php函数本身

我有一个函数可以调用自己,并且如果可以或不需要您的批准,那么需要您的批准?

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

结果就是我多么想成为,它的伟大工程,但我不不知道这是否是一种好的做法。

递归函数是可以的 - 但如果你不确定自己在做什么,那么它很危险。如果一个函数有可能在一个递归循环中结束(它一直在不停地调用自己),你将会超时,耗尽内存或造成僵尸启示。

将递归调用想象成一把非常非常锋利的刀 - 在经验丰富的厨师的手中,这是在天堂中制作的匹配,在洗碗机的手中,这是一个等待发生的丢失手指。

PHP尝试播放很好,默认情况下将递归深度限制为100(尽管可以更改),但对于几乎所有情况,如果递归深度达到100,事故已经发生,PHP通过停止任何额外的行人徘徊在交通中。 :)

+2

或更短:递归函数并不是一个坏习惯。 :) – Virus721

+1

@ Virus721是的,如果你不知道你在做什么,他们的行为是不好的做法:) – Fluffeh

+1

这种情况下的不良做法是不知道你在做什么,不使用递归函数。 – Virus721

就递归函数而言,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; 

     } 
    } 
} 

我想,如果你知道数组的深度是很好用

$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>"; 

我不知道,如果它是一个很好的解决方案,但我用这样一来,从自身内部调用一个函数:

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