2016-12-19 9 views
1

多次元配列のすべてのレイヤーから値を返すのに苦労しています。値はすべての子要素になります。私はたくさんのループを試しましたが、それを正しく得ることはできません。誰か助けてください - 私は年齢のために立ち往生してきました!ありがとうございました。ループスルーPHPマルチレベル連想配列

配列は次のとおりです。

Array 
(
    [SiteRep] => Array 
     ( [DV] => Array 
       (
        [Location] => Array 
         (
          [Period] => Array 
           (
            [0] => Array 
             (
              [value] => 2016-12-19Z 
              [Rep] => Array 
               (
                [0] => Array 
                 (
                  [D] => W 
                  [F] => 1 
                  [G] => 9 
                 ) 

                [1] => Array 
                 (
                  [D] => W 
                  [F] => 0 
                  [G] => 7 
                 ) 

               ) 
             ) 

            [1] => Array 
             (
              [value] => 2016-12-20Z 
              [Rep] => Array 
               (
                [0] => Array 
                 (
                  [D] => ENE 
                  [F] => 4 
                  [G] => 7 

                 ) 

                [1] => Array 
                 (
                  [D] => E 
                  [F] => 3 
                  [G] => 9 

                 ) 

これまでのところ、私のコードは次のとおりです。

$i=0; 
    foreach ($json_decoded['SiteRep']['DV']['Location']['Period'][$i] as $key => $value) { 
    if (is_array($value)){ 
     foreach ($value as $key2 => $value2){ 
      if (is_array($value2)){ 
       foreach ($value2 as $key3 => $value3) { 
        echo $key3 . " 3: " . $value3 . "<br>"; 
       } 
      } else { 
       echo $key2 . " 2: " . $value2 . "<br>"; 
      } 
     }; 

    } else { 
     echo $key . " 1: " . $value . "<br>"; 
    } 
    $i++; 
}; 

答えて

3

私はあなたが再帰を探していると信じています。自身を呼び出す関数。それは難しいかもしれませんが、不確定な深さの配列をナビゲートするのが最も効率的な方法です。

function printStuff($stuff) 
{ 
    echo $stuff['value'] 
    if (isset($stuff['rep'])) 
    { 
    printStuff($stuff['rep']); 
    } 
} 

あなたは値が単純に戻り値にエコー変更を伝承したい場合:

function printStuff($stuff) 
{ 
    $temp = $stuff['value'] 
    if (isset($stuff['rep'])) 
    { 
    $temp .= printStuff($stuff['rep']); 
    } 
    return $temp; 
} 

注:再帰が無限ループに似て正しく設定されていない場合はメモリ不足の原因となることができ、など再帰関数呼び出しは毎回関数呼び出しを呼び出しスタックにプッシュします。関数呼び出しに渡されたパラメータのサブセットがあることを確認してください。

+0

ありがとうございました。私の現在のレベルではかなり複雑に見えます。私は再帰関数の周りに少しの研究を行うでしょう –

0

配列に一定数のレイヤがある場合は、各レイヤにforeach-functionを使用できます。配列のたびに異なる数のレイヤーがある場合は、再帰を使用する必要があります。これは、状況に応じた唯一のソリューションであるためです。このような

何か:私はドリルダウン続け、私が使用して必要なすべてのデータを得ることができました

array_walk_recursive($array, function($item, $key){ 
    //your actions 
}); 
+0

ありがとう、もう一度、私はこの周りのより多くの読書をする必要があると思う –

0

...

foreach ($json_decoded['SiteRep']['DV']['Location']['Period'] as $key => $value) { 
if (is_array($value)){ 
    foreach ($value as $key2 => $value2){ 
     if (is_array($value2)){ 
      foreach ($value2 as $key3 => $value3) { 
       foreach ($value3 as $key4 => $value4) { 
        echo $key4 . ": " . $value4 . "<br>"; 
       } 
      } 
     } else { 
      echo $key2 . ": " . $value2 . "<br>"; 
     } 
    }; 
} else { 
    echo $key . ": " . $value . "<br>"; 
} 
$i++; 

};