【问题标题】:PHP - Multidimensional array recursionPHP - 多维数组递归
【发布时间】:2017-02-26 06:07:23
【问题描述】:

我有一个问题,我知道如何解决它,但不是 100% 清楚实施会是什么样子。

这是一个 Symfony 3 应用程序,但问题是纯 PHP 应用程序涉及某种递归。

我有一个多维数组,它代表我的嵌套表单和一个需要映射到表单字段的错误(我知道该怎么做)。

这是我的数组:

我需要递归循环遍历fields 的子节点,当我到达一个节点的末尾并且它包含message 键(只是一种确认我已经遇到错误的方法)然后将其应用于表单@ 987654326@ 然后删除那个索引/节点,这样递归就不会再沿着这条路线走?

任何人都可以帮助执行此功能。就像我说的,了解 Symfony 并不重要,它只是帮助处理将递归多维数组并在再次调用自身之前删除该节点的函数。

我所在的班级但如果我可以按照数组键操作,我可以减少至少 50%:

http://laravel.io/bin/ok5n9

任何帮助将不胜感激:)

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: php arrays recursion multidimensional-array


【解决方案1】:

在遍历数组时,使用 for 循环,以便轻松操作索引:

for($i = 0; $i < count($fields); $i++) {
    // You can use $fields[$i] here for the current item
}

使用isset(),您可以检查message 键是否存在于fields 数组中。如果是这样,请使用 continue 关键字跳过当前项并继续下一项。

它看起来像这样,您可以根据需要进行更改:

for($i = 0; $i < count($fields); $i++) {
    if (isset($fields[$i]['message')) {
        // error exists...
        continue;
    }

    // Delete the item from your array
    unset($fields[$i]);
}

【讨论】:

  • 这将是递归函数内部的代码,对吧?您仍然需要再次调用自己才能进入下一层?同样出于好奇,为什么-1?
  • 我认为- 1 是一个错误,因为它会跳过最后一个字段。
  • -1 是因为 count() 函数是 1-indexed,但 PHP 中的数组是 0-indexed。
【解决方案2】:

这是我的解决方法。我创建了一个表单映射,其中包含字段数,每个字段都有子数组,用于元素的路径和错误。

然后我遍历它们并通过 Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapper 中的 Symfonys mapViolation 方法传递它们。

这是完整的课程: https://gist.github.com/linxlad/3ec76c181f717fba532bf43484b7c970

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-21
    • 2014-10-31
    • 2013-11-11
    • 2017-12-28
    • 2017-11-28
    • 2010-12-08
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多