【问题标题】:How can I merge this two recursive functions into one?如何将这两个递归函数合并为一个?
【发布时间】:2021-09-27 07:10:10
【问题描述】:

我想将这两个函数合并为一个,因为我想要一个更易读的代码,但我找不到解决方案。 你能帮帮我吗?

function setTplArray_fn($data) {
   $array = [];
   if (!is_array($data)) {
       return htmlspecialchars($data);
   }
   else {
       foreach ($data as $key => $value) {
           $array[htmlspecialchars($key)] = setTplArray_fn($value);
       }
   }

   return $array;
}

function setTplArray($key, $data) {
   global $tplArray;

   $tplArray[$key] = setTplArray_fn($data);
}

【问题讨论】:

  • 你的数据是什么样的?
  • 一个数组或多维数组,具有一个 int/string 键和一个可以是另一个数组或字符串值的值,如果它是一个数组,则函数遍历自身并使用 htmlspecialchars “清理”所有值。

标签: php recursion


【解决方案1】:

将执行单一操作的代码块提取到专用函数中是编程中非常常见的最佳实践。此外,没有专用函数的递归确实使代码更难阅读,至少在我(以及我遇到的每个人)看来。

如果您想让您的代码更具可读性,请添加一些 cmets 和类型提示,稍微重新组织代码,并以清晰的方式命名。

例如,虽然我对您的代码库了解不多,但我会像这样重写您的函数:

/**
 * @param array|string $data
 * @return array|string
 */
function sanitizeTplValues($data) {
    // If passed a string, just sanitize it normally
    if (!is_array($data)) {
        return htmlspecialchars($data);
    }

    // If passed an array, sanitize both the key and the values
    // NOTE: The value sanitization recursively calls this same function
    $array = [];
    foreach ($data as $key => $value) {
        $array[htmlspecialchars($key)] = sanitizeTplValues($value);
    }

    return $array;
}
  • 在顶部,我添加了几乎所有现代 IDE 都支持的 DocBlock 标签。在这里进行描述也是一个好主意,但我会留给你。
  • 我重命名了函数以更好地与(我认为的)它的功能保持一致
  • 通常,else 实际上并不需要,这里就是这种情况。我们可以提前return,我们的大脑可以假设一旦我们通过了第一个if,我们就可以保证有一个数组
  • 我将数组声明移到了第一个块的下方,因为那里没有使用它
  • 我添加了 cmets,尽管有人认为代码“足够明显”
  • 我在代码中明确调用了递归。我个人更喜欢使用NOTE: 语法来做到这一点,尽管有些人认为评论中的注释很奇怪。

调用代码只是略有变化,上面应用了一些:

/**
 * @param string $key
 * @param array|string $data
 */
function setTplArray(string $key, $data) {
    global $tplArray;

    $tplArray[$key] = sanitizeTplValues($data);
}

我所做的所有更改都基于行业标准建议以及我自己的个人喜好。它们在任何方面都不是绝对的,您可以挑选适合自己的。

我写了很多递归代码,你必须尽早决定的一件事是“这是一个还是两个函数”,99% 的时间我推荐两个函数。如果你只有一个,你的代码必须弄清楚如何引导自己。这通常是通过可选的空参数、深度检查或魔法值来完成的,所有这些都只是自找麻烦。如果您可以改为让一个函数为您执行引导逻辑,而另一个函数始终是 100% 递归的,那么它就可以清楚地分离关注点并且更容易维护。

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 2019-05-28
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多