2016-07-10 7 views
0

私は入力配列から空のキーを持つ配列を返す関数を持っています。問題は、私が矛盾したデータに取り組んでいることです。データは、ネストされた配列の任意のレベルに移動できます。たとえば、この関数を再帰的関数に減らすにはどうすればよいですか?

$inputArray = [ 
    'a' => 'value a', 
    'b' => [ 
     1 => [], 
     2 => 'value b2', 
     3 => [ 
      'x' => 'value x' 
      'y' => '' 
     ], 
    'c' => '' 
    ], 
]; 

この種類のデータを文字列に変換する出力が必要です。だから、

$outputArray = [ 
    'empty' => [ 
     'b[1]', 
     'b[3][y]', 
     'c' 
    ] 
]; 

は、ここで私は空の値を持つキーを取得するために、これまで持っているものです。

$outputArray = []; 
foreach ($inputArray as $key => $value) { 
    if (is_array($value)) { 
     foreach ($value as $index => $field) { 
      if (is_array($field)) { 
       foreach ($field as $index1 => $value1) { 
        if (empty($value1)) { 
         array_push($outputArray['empty'], $key . '[' . $index . ']' . '[' . $index1 . ']'); 
        } 
       } 
      } 
      if (empty($field)) { 
       array_push($outputArray['empty'], $key . '[' . $index . ']'); 
      } 
     } 
    } 
    if (empty($value)) { 
     array_push($outputArray['empty'], $key); 
    } 
} 
return $outputArray; 

私は入力配列は、任意のレベルまでネストすることができ言ったように。私は、配列がもう一つのレベルでネストされるたびにブロックif (is_array)を追加し続けることができません。私はそれが再帰関数を使用して解決することができると信じていますが、私はどのように把握できないようです。これで私を助けてください。ありがとう。

答えて

2

あなたは再帰関数について正しいですが、再帰の有無にかかわらず、再帰についても認識する必要があります。トリッキーな部分は、再帰関数に現在のレベルキーを渡している。

function findEmpties($input, $currentLevel = null) { 
    static $empties = []; 

    foreach ($input as $key => $value) { 
     $levelItem = $currentLevel ? "{$currentLevel}[{$key}]" : $key; 
     if (empty($value)) { 
      $empties['empty'][] = $levelItem; 
     } else { 
      if (is_array($value)) { 
       findEmpties($value, $levelItem); 
      } 
     } 
    } 

    return $empties; 
} 

Live demo

関連する問題