2016-10-17 223 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