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

时间:2013-09-05 11:10:57

标签: php function call self-reference

我只是想确保我做得对,这不会造成任何疑虑。

我有一个自我调用的功能,如果可以或不这样做需要你的批准吗?

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

结果就是我想成为的样子,效果很好,但我不知道这是不是一个好习惯。

4 个答案:

答案 0 :(得分:33)

递归函数没问题 - 但如果您不确定自己知道自己在做什么,那就太危险了。如果某个函数有可能在递归循环中结束(它一直在反复调用自己),你将会超时,内存耗尽或导致僵尸启示。

将递归电话想象成一把非常非常锋利的刀 - 在一位经验丰富的厨师手中,这是一场在天堂制作的比赛,在洗碗机的手中,这是一个等待发生的失落的手指。

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

答案 1 :(得分:3)

就递归函数而言,Fluffeh提供了足够的答案。但是当使用大型数组/对象/等的递归时,您应该观察代码的优化,这样就不需要花费太多的内存或CPU能力来执行。

您可以轻松优化代码,使其更清晰,占用更少内存,并对意外数据更具弹性。请注意&amp;在函数参数列表中(每次调用嵌套函数时都会消除创建数组的副本)。

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;

        }
    }
}

答案 2 :(得分:1)

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

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

答案 3 :(得分: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>";