2016-10-17 3 views
3

문제가 있습니다. 어떻게 해결할 지 알고 있지만 구현이 어떻게 될지 100 % 명확하지 않습니다.PHP - 다차원 배열 재귀

이것은 Symfony 3 앱이지만 문제는 일종의 재귀를 포함하는 순수 PHP입니다.

나는 중첩 된 양식을 나타내는 다차원 배열과 양식 필드에 매핑해야하는 오류 (그 방법은 알고 있습니다.)가 있습니다. 여기

내 배열 :

enter image description here

내가 재귀 fields의 자녀를 반복 할 필요가 난 노드의 끝에 도달하며 message 키 (내가 가지고 확인하는 단지 방법을 포함하는 경우 오류가 발생했습니다) 다음 양식에 적용 // apply to form here 그런 다음 재귀가 그 경로를 다시 내려 가지 않도록 해당 색인/노드를 제거 하시겠습니까?

누구든지이 작업을 수행 할 수있는 기능을 제공 할 수 있습니까? 마찬가지로 Symfony가 다차원 배열을 되풀이하고 다시 자신을 호출하기 전에 해당 노드를 제거하는 함수에 도움이된다는 것을 아는 것은 중요하지 않다고 말했다.

그것에 내 클래스는 의미하지만, 난 그냥 배열 키를 따를 수 있다면이의이어야 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()을 사용하면 배열에 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