foreachループ内でif/elseif / elseを実行する代わりに$data
(これは常に、その構造と多くのコード重複を使用してそこに「書き込む」数に制限されます)、if / elseif/elseをに変換する必要があります。それ自身のループ。
しかし、最初に既存のコードを変換します。最初のif本体から始めます。これには、必要なすべてのコードがすでに含まれています。
$f0 = $fields[0];
$fv0 = $val[$f0];
$parsedData[$fv0][] = $val;
は、名前ueでキー設定され$val
た配列に割り当てる必要があります。これをここで圧縮してみましょう。名前の数は、もう必要ないので不要です(ただし、最初の数かもしれません)。$parsedData
$fields
$val
0
$field = $fields[0];
$value = $values[$field];
$parsedData[$value][] = $values;
(命名を改善するために変更$val
しました)。$values
これにより、読みやすく、理解しやすくなりました。また、ここで魔法の数を0
より簡単に見つけることができます。
今魔法に。ここで配列に追加します(プッシュ):
$parsedData[$value][] = $values;
これをより簡単にするために、次のように変えましょう。
$array = &$parsedData[$value];
$array[] = $values;
これは今のところ不要に思えますが、これがループになると、より明確になります。
$array = &$parsedData;
...
$array = &array[$value];
...
$array[] = $values;
この時点で、外側のループを使用してコードを確認しましょう。
foreach ($data as $values)
{
$array = &$parsedData;
$field = $fields[0];
$value = $values[$field];
$array = &$array[$value];
$array[] = $values;
}
明らかに、このコードはまだ完全ではありません。内側のループはありませんが、ある種の体を取得し始めます。そして実際には、内側のループを実現するのは非常に簡単です。
$array = &$parsedData;
foreach ($fields as $field)
{
$value = $values[$field];
$array = &$array[$value];
}
$array[] = $values;
そして、それはすでにそれです。単一のフィールドは、すべてのフィールドの反復になりました。反復の各ステップごとのサブ配列のエイリアシング/参照により、内部ループが終了した後、値を適切な配列エントリにプッシュできます。
外側と内側のループ全体:
foreach ($data as $values)
{
$array = &$parsedData; # set reference
foreach ($fields as $field)
{
$value = $values[$field];
$array = &$array[$value];
}
$array[] = $values;
unset($array); # remove reference
}