2016-10-17 2 views
3

У меня проблема, я знаю, как ее решить, но не на 100% понять, как будет выглядеть реализация.PHP - многомерная рекурсия массива

Это приложение Symfony 3, но проблема в том, что это чистый PHP, который предполагает какую-то рекурсию.

У меня есть многомерный массив, который представляет мою вложенную форму и ошибки, которые необходимо сопоставить с полем формы (этот бит, который я знаю, как это сделать).

Вот мой массив:

enter image description here

мне нужно перебрать ребенок fields рекурсивно, и когда я достигаю конец узла и содержит message ключа (только способ подтверждения у меня есть достигли ошибки), затем примените это к форме // apply to form here, затем удалите этот индекс/узел так, чтобы рекурсия не опускала этот маршрут еще раз?

Может ли кто-нибудь помочь с функцией, которая сделает это. Как я уже сказал, не важно знать, что Symfony просто помогает с функцией, которая будет возвращать mutli-мерный массив и удалять этот узел, прежде чем снова вызвать себя.

Мой класс на него стоит , но я могу сократить по крайней мере 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 в массиве 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]); 
} 
+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

Смежные вопросы