2016-07-10 4 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

관련 문제