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

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个回答

44

递归函数是可以使用的,但是如果不确定自己在做什么,就会很危险。如果有任何可能使函数陷入递归循环(不断地调用自身),您将无法正常运行、耗尽内存或引发僵尸启示录。

把递归调用想象成一把非常锋利的刀--在经验丰富的厨师手中,这是天作之合;但在洗碗工人手中,却很容易割伤手指。

PHP 尽力避免发生问题,默认情况下将递归深度限制为 100(尽管可以更改),但对于几乎所有情况而言,如果递归深度达到了 100,则事故已经发生,PHP 的反应是停止任何额外的行人进入交通流中。 :)


5
递归函数并不是一种坏的编程实践。 :) - Virus721
2
@Virus721 是的也不是,如果你不知道你在做什么,它们就有点成为了一种不好的实践 :) - Fluffeh
1
在这种情况下的不良做法是不知道自己在做什么,而不是不使用递归函数。 - Virus721
@Virus721 完全不反对这个观点 :) - Fluffeh
4
很好的回答,赞一个关于僵尸启示录。 - Tony M
显示剩余3条评论

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;

        }
    }
}

1

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接