如何在PHP中以最佳方式构造递归函数的函数参数?

时间:2011-02-25 04:01:43

标签: php function recursion

我没有太多的PHP经验,我想知道如何在PHP中最好地创建递归函数。举个例子

$config = array(
    "MYSQL" => array(
        "SERVER" => "localhost",
        "USERNAME" => "root",
        "PASSWORD" => ""
    ),
    "FOO" => "bar"
);

// Make the config global
config_parse(false, $config);

function config_parse($index, $value)
{
    if(is_array($value))
    {
        foreach($value as $i => $e)
        {
            config_parse(($index ? $index . "_" : "") . $i, $e);
        }
    }
    else
    {
        define($index, $value);
    }
}

它做了我想要它做的事情,但是当我以这种方式初始化递归函数时,我觉得我“乱砍”/编写错误的代码(将false作为初始索引并在函数中检查它)

解决这个问题的方法可能是颠倒输入参数的顺序,这意味着当数组作为值传递时,不会访问索引值。

另一种方法是将递归函数拆分为启动函数和回调函数。

我想知道的是什么是“最佳实践”,最好是基于我的例子。

感谢您的回复

2 个答案:

答案 0 :(得分:3)

对我而言,这取决于递归的复杂性。在具体示例中,您只需翻转参数并将第二个默认设置为null(在这种情况下,我更喜欢null而不是false)。

function config_parse($value, $index = null)
{
  // your logic - id detect null with if(null === $index)
}

答案 1 :(得分:0)

如果你有一个现有的系统,这可能是不可行的,但是我认为你可能确实想要一组加载的配置的通用前缀,这样不同的配置不会无意间互相破坏。这也使代码更简洁,更清晰:

function parseConfig($config,$index='CONFIG'){
  if(is_array($config)){
      foreach($config as $suffix => $subConfig){
          parseConfig($index . '_' . $suffix, $subConfig)
   }else{
       define($index,$config)
   }
}