2016-10-17 207 views
3

我有一个问题,我知道如何解决它,但不是100%清楚实现的样子。PHP - 多维数组递归

这是一个Symfony 3应用程序,但问题是纯粹的PHP问题,涉及某种递归。我有一个多维数组,代表我的嵌套形式和需要映射到表单字段(我知道该怎么做)的错误。

这里是我的数组:

enter image description here

我需要循环的fields孩子递归,当我到达一个节点的末尾,它包含message键(只是一种方式,以确认我有达到了错误),然后将其应用到表格// apply to form here,然后删除该索引/节点,以便递归不会再次下降该路线?

任何人都可以帮助完成此功能。就像我说的,知道Symfony只是帮助使用多维数组并重新调用自身之前删除该节点的函数并不重要。

我在它的类代表但我可以削减ATLEAST 50%的,如果我可以只按照数组键:

http://laravel.io/bin/ok5n9

任何帮助,将不胜感激:)

+2

什么你试过这么远吗? – vaso123

回答

1

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

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

使用isset(),您可以检查fields阵列中是否存在message密钥。如果是这样,请使用关键字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]); 
} 
+0

这将是递归函数中的代码,但对吗?你仍然需要再次打电话到下一层?也出于好奇为什么'-1'? – Kal

+0

我相信' - 1'是一个错误,因为它会跳过最后一个字段。 – Pete

+0

'-1'是因为'count()'函数是'1'索引的,但PHP中的数组是'0'索引的。 –

0

这是我的修补程序。我创建了一个表单映射,它由每个元素的路径和错误的子数组构成。

然后,我循环它们,并通过Symfonys mapViolation方法在Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapper中传递它们。

下面是完整的类: https://gist.github.com/linxlad/3ec76c181f717fba532bf43484b7c970