2016-07-10 8 views
0

Ich habe eine Funktion, die ein Array mit leeren Schlüsseln aus dem Eingabearray zurückgibt. Das Problem ist, dass ich an inkonsistenten Daten gearbeitet habe. Die Daten könnten auf jede Ebene eines verschachtelten Arrays gehen. Zum BeispielWie reduziere ich diese Funktion in eine rekursive?

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

Ich brauche einen Ausgang, der diese Art von Daten in eine Zeichenfolge konvertiert. So

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

Hier ist, was ich bisher Schlüssel mit leeren Werten zu erhalten:

$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; 

Wie gesagt die Eingangsanordnung auf jeder Ebene verschachtelt werden. Ich kann nicht immer if (is_array) Block hinzufügen, jedes Mal, wenn das Array eine weitere Ebene verschachtelt ist. Ich glaube, es könnte mit einer rekursiven Funktion gelöst werden, aber ich kann nicht herausfinden, wie. Bitte hilf mir dabei. Vielen Dank.

Antwort

2

Sie haben Recht mit einer rekursiven Funktion, aber Sie sollten sich auch der Rekursionen bewusst sein, ob wir in oder außerhalb einer Rekursion sind. Der schwierige Teil vergeht Strompegel Schlüssel für die rekursive Funktion:

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