2012-09-18 5 views
0

그냥 뭔가 작업하고 foreach를 사용하여 배열을 반복하지 않고이 문제에 대한 간단한 해결책을 찾을 수 없습니다. 아무도 내가 값은 전혀 문제 난 그냥에 대해 실행할 수있는 키가 필요하지 않습니다이배열을 중첩 된 배열로 바꾸기

array(1) { 
    ["a"]=> 
    array(1) { 
    [0]=> 
    array(1) { 
     ["b"]=> 
     array(1) { 
     [0]=> 
     array(1) { 
      ["c"]=> 
      array(1) { 
      [0]=> 
      array(1) { 
       ["d"]=> int(1) //this value does not matter 
      } 
      } 
     } 
     } 
    } 
    } 
} 

속으로이

&array(4) { 
["a"]=>int(0) 
["b"]=>int(1) 
["c"]=>int(2) 
["d"]=>int(3) 
} 

을 설정하려면이

에 대한 간단한 해결책이 있습니까 array_intersect_key_recursive 함수입니다.

편집 : 배열은 그것이 내가이 아마도 당신을 돕는 끝낼 수있는 방법을 모르는 배열

+1

왜'가 d' 않는'INT (1)'? –

+0

결과 배열을 만들 때 1을 값으로 사용했기 때문에. 정말 가치가 무엇인지는 중요하지 않습니다. int (3)로 변경하여 명확하게 만듭니다. – Mike

답변

1

의 배열로 중첩 될 필요가 테스트 한 후 변경,하지만 그럼에도 불구하고 재미있는 운동이었다.

$newArray = array(); 
$last = &$newArray; 
$array = array_reverse(array_keys($array)); 
while ($item = array_pop($array)) { 
    if (!is_array($last)) { 
     $last = array(); 
    } 
    $last[$item] = array(array()); 
    $last = &$last[$item][0]; 
} 

참고 : 나는 int(1)로이 대답을했다. 값을 중요하지 않으므로 값을 변경하지 않으려 고합니다. 값이 중요한 경우 조금 더 많은 작업을해야합니다 (원래 배열의 값을 $item으로 얻는 것과 비슷합니다). 키).

0

또 다른 방법 사용하여 재귀 :

function toNestedArray(array $array, $index = 0) { 
    $return = array(); 
    if ($index < count($array)) { 
     $return[$array[$index]] = toNestedArray($array, ++$index); 
    } 
    return $return; 
} 

사용 예 :

$flatArray = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4); 
$nestedArray = toNestedArray(array_keys($flatArray)); 
print_r($nestedArray); 

출력 :

Array 
(
    [a] => Array 
     (
      [b] => Array 
       (
        [c] => Array 
         (
          [d] => Array 
           (
           ) 

         ) 

       ) 

     ) 

) 
관련 문제