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

发布于 2024-10-18 22:11:31 字数 780 浏览 1 评论 0原文

我没有太多的 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 作为初始索引并在函数中检查它),我觉得我正在“黑客攻击”/编写糟糕的代码

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

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

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

感谢您的回复

I don't have much PHP experience and I want to know how to best create a recursive function in PHP. Take this example

$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);
    }
}

It does what I want it to do, but I feel that I'm "hacking"/writing bad code when I initialize the recursive function in this way (passing false as the initial index and checking for it in the function)

A way to work around this could be to reverse the order of the input parameters, which means that the index value wouldn't be accessed when an array was passed as value.

Another way could be to split the recursive function into initiation function and callback function.

What I want to know is what's the "best practice", preferably based on my example.

Thanks for replies

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泪是无色的血 2024-10-25 22:11:31

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

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

For me it depends on the complexity of the recursion. In the specific example you give i would just flip the parameters and make the second default to null (i prefer null over false in this case).

function config_parse($value, $index = null)
{
  // your logic - id detect null with if(null === $index)
}
吃不饱 2024-10-25 22:11:31

如果您有一个现有的系统,这可能不可行,但是我认为您可能确实希望一组加载的配置有一个通用的前缀,这样不同的配置就不会无意中互相破坏。这也使得代码更短更清晰:

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

This may not be feasible if you have an existing system, however I would argue that you probably do want a common prefix to a set of loaded configs in general so that different configs don't unintentionally clobber each other. This also makes the code shorter and cleaner:

function parseConfig($config,$index='CONFIG'){
  if(is_array($config)){
      foreach($config as $suffix => $subConfig){
          parseConfig($index . '_' . $suffix, $subConfig)
   }else{
       define($index,$config)
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文