2012-08-25 4 views
0

나는이 문제를 혼자서 풀려고했지만 이해할 수있는 해결책을 찾을 수 없습니다.배열 키의 재귀 적 이름 바꾸기

동적 구성 파일을 읽음으로써 응용 프로그램이로드 될 때 즉시 작성되는이 어레이가 있습니다.

제 문제는 alias이라는 배열을 가져오고 부모 배열의 이름을 ['@attr']으로 변경하고 싶습니다. 여기에 제가 의미하는 것을 보여주는 예가 있습니다. 내 _alias 재산의 인 print_r을 할 경우

[database] => Array 
     (
      [0] => Array // Would be renamed to "production" 
       (
        [host] => test 
        [user] => test 
        [pass] => test 
        [name] => test 
        [port] => test 
        [@attr] => Array 
         (
          [alias] => production 
          [name] => live 
         ) 

       ) 

      [1] => Array // Would be renamed to "development" 
       (
        [user_data] => Array 
         (
          [0] => Array // Would be renamed to "three" 
           (
            [user] => sample 
            [@attr] => Array 
             (
              [alias] => three 
             ) 

           ) 

          [1] => Array // Would be renamed to "two" 
           (
            [user] => sample 
            [@attr] => Array 
             (
              [alias] => two 
             ) 

           ) 

         ) 

        [host] => test 
        [user] => test 
        [pass] => test 
        [name] => test 
        [port] => test 
        [@attr] => Array 
         (
          [alias] => development 
         ) 

       ) 

     ) 

이 내가이

Array 
(
    [production] => Array 
     (
      [host] => test 
      [user] => test 
      [pass] => test 
      [name] => test 
      [port] => 3306 
      [@attr] => Array 
       (
        [name] => live 
       ) 

     ) 

    [development] => Array 
     (
      [user_data] => Array 
       (
        [0] => Array 
         (
          [user] => sample 
          [@attr] => Array 
           (
            [alias] => three 
           ) 

         ) 

        [1] => Array 
         (
          [user] => sample 
          [@attr] => Array 
           (
            [alias] => two 
           ) 

         ) 

       ) 

      [host] => test 
      [user] => test 
      [pass] => test 
      [name] => test 
      [port] => 3306 
     ) 

) 

주를 얻을 내 코드 지금까지

private function _applyXmlAlias($array) 
     { 
      foreach ($array as $config) 
      { 
       if (is_array($config)) 
       { 
        if (isset($config['@attr']['alias'])) 
        { 
         $alias = $config['@attr']['alias']; 

         unset($config['@attr']['alias']); 

         if (empty($config['@attr'])) 
         { 
          unset($config['@attr']); 
         } 

         $this->_alias[$alias] = $config; 

         break; 

         //$this->_temp = reset(); 


        } else { 

         $this->_applyXmlAlias($config); 
        } 
       } 
      } 
     } 

이다 : 나는 확실히 왜 내 루프뿐만 아니라 해요 키가 alias이고 마지막 값이 production이고 development

인 마지막 중첩 배열을 캡처하지 않습니다.

내가 어떻게 접근 할 수 있는지에 대한 아이디어가 있습니까? 나는 가까운 길에 작은 가이드가 필요하다고 생각합니다.

감사

편집 : 현재 시도한다

+0

휴식 이상 ... 내 의견을 참조하십시오. – EthanB

답변

0

귀하의 알고리즘은 깊이 우선 탐색을하고있다을 반영하기 위해 제 기능을 업데이트했습니다. 문제는 종료시기를 알 수 없다는 것입니다. 대신 무효 리턴 형의

,이 같은 시도 :

private function _applyXmlAlias($array) 
    { 
     $found_alias = FALSE; 
     foreach ($array as $config) 
     { 
      if (is_array($config)) 
      { 
       if (isset($config['@attr']['alias'])) 
       { 
        $this->_alias = reset(array_values($config)); 
        $found_alias = TRUE; 
         break; 
       } else { 
        if ($this->_applyXmlAlias($config)) { 
         $found_alias = TRUE; 
         break; 
        } 
       } 
      } 
     } 
     return $found_alias; 
    } 
+0

무엇을 권하고 싶습니까? 거기에 '휴식'을해야합니까? 비슷한 접근 방식을 시도했지만 결국 키 중 하나에서 값을 가져 오는 경우. 내 최근 시도를 보여주기 위해 코드를 업데이트했습니다. – Eli

+0

샘플로 업데이트 ... 나누기가 완전히 해결되지 않을 수 있습니다. 호출자에게 깊이있는 것을 알려주는 방법이 필요합니다. , 너무. – EthanB

0

아주 가능성이없는 가장 우아한 해결책을하지만, 작동합니다.

function renameArr($arr) { 
    foreach($arr as $key=>$val) { 
     if(is_array($val)) { 
      if(isset($val['@attr']['alias'])) { 
       unset($arr[$key]); 
       $key = $val['@attr']['alias']; 
      } 
      $arr[$key] = renameArr($val); 
     } 
    } 
    return $arr; 
}