2016-10-17 15 views
3

私はそれに取り組む方法を知っていますが、実装がどのように見えるかについては100%明確ではありません。PHP - 多次元配列の再帰

これはSymfony 3アプリケーションですが、問題は何らかの再帰を伴う純粋なPHPです。

私は自分の入れ子になったフォームと、フォームフィールドにマップする必要があるエラー(私はそのやり方を知っている)を表す多次元配列を持っています。ここで

私の配列です:

enter image description here

私はノードの最後に到達し、それは私が持っているmessageキー(確認するだけの方法が含まれている場合、私は再帰的fieldsの子供をループする必要があり、エラーに達した場合)、それをフォーム// 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()を使用すると、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

これは私の修正です。私は要素のパスとエラーの子配列を持つフィールドの数からなるフォームマップを作成しました。

その後、それらをループオーバーし、Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapperのSymfonys mapViolationメソッドに渡します。ここで

は完全なクラスです: https://gist.github.com/linxlad/3ec76c181f717fba532bf43484b7c970