2014-11-13 2 views
0

문자열 중 0이 아닌 문자를 중첩 된 배열 키로 변환하는 방법을 알아 내려고합니다. 예를 들어, $id = '12430'으로 주어진다면 $tree[1][2][4][3]['id'] = '12430'으로 끝내고 싶습니다. 몇 가지 다른 방법을 시도해 보았습니다. 가장 최근의 결과는문자열 문자를 중첩 된 배열 키로 바꾸기

$id = '12430'; 
$keys = str_split($id); 

function addKey($keys, $id, $array = array()) 
{ 
    if ($keys[0] != '0') 
    { 
     $key = $keys[0]; 
     $array[$key] = array(); 

     array_shift($keys); 

     addKey($keys, $id, $array[$key]); 
    } 
    else 
    { 
     $array['id'] = $id; 

     return $array; 
    } 
} 

$tree = addKey($keys, $id); 

내가 뭘 잘못하고 있니? 또는 심지어 가능합니까?

+0

패턴이란 무엇입니까? 왜 '0'은 무시됩니까? – AbraCadaver

+0

@AbraCadaver 내 목적에 의미가 없으므로. (나는 가계도를 짓고 있습니다.) – gr8dane

+0

@AbraCadaver FYI,이 특정 ID는 1 세대 부부의 두 번째 자녀의 4 번째 자녀의 3 번째 자녀임을 나타냅니다. – gr8dane

답변

0

코드 :

class Tree { 

    /** 
    * @static 
    * @access private 
    * @var  array 
    */ 
    private static $aTree = array(); 

    /** 
    * Add single key. 
    * 
    * @static 
    * @access public 
    * @param string $sString 
    * @param array $aTree 
    * @param string $sStoredString 
    */ 
    public static function addKey($sString, array &$aTree = NULL, $sStoredString = NULL) { 
     if($aTree === NULL) { 
      $aTree = &static::$aTree; 
     } 

     if($sStoredString === NULL) { 
      $sStoredString = $sString; 
     } 

     $sNewKey  = $sString[0]; 
     $sNewString = substr($sString, 1); 

     if(empty($sNewKey)) { 
      $sNewString = ''; 
      $aTmp  = &$aTree; 
     } else { 
      if(!isset($aTree[$sNewKey])) { 
       $aTree[$sNewKey] = array(); 
      } 

      $aTmp = &$aTree[$sNewKey]; 
     } 

     if(!empty($sNewString)) { 
      static::addKey($sNewString, $aTmp, $sStoredString); 
     } else { 
      if(!isset($aTmp['id'])) { 
       $aTmp['id'] = $sStoredString; 
      } else { 
       $aTmp['id'] = array($aTmp['id'], $sStoredString); 
      } 
     } 
    } 

    /** 
    * Add multiple keys. 
    * 
    * @static 
    * @access public 
    * @param array $aKeys 
    */ 
    public static function addKeys(array $aKeys) { 
     foreach($aKeys as $sKey) { 
      static::addKey($sKey, static::$aTree, $sKey); 
     } 
    } 

    /** 
    * Get whole tree. 
    * 
    * @static 
    * @access public 
    * @return array 
    */ 
    public static function getTree() { 
     return static::$aTree; 
    } 

} 

예 :

Tree::addKeys(array('12400', '12430', '233', '2010', '2011')); 
Tree::addKey('1111'); 

echo '<pre>'; 
print_r(Tree::getTree()); 
echo '</pre>'; 

아웃 :

Array 
(
    [1] => Array 
     (
      [2] => Array 
       (
        [4] => Array 
         (
          [id] => 12400 
          [3] => Array 
           (
            [id] => 12430 
           ) 

         ) 

       ) 

      [1] => Array 
       (
        [1] => Array 
         (
          [1] => Array 
           (
            [id] => 1111 
           ) 

         ) 

       ) 

     ) 

    [2] => Array 
     (
      [3] => Array 
       (
        [3] => Array 
         (
          [id] => 233 
         ) 

       ) 

      [id] => Array 
       (
        [0] => 2010 
        [1] => 2011 
       ) 

     ) 

) 

이 당신이 필요로 무엇입니까?

+0

첫 번째 0에서 중지해야합니다. 0은 그냥 자리 표시 자이며 항상 문자열의 끝에 위치합니다. – gr8dane

+0

@ gr8dane 답변 됨. –

+0

나는 이것이 내가하려고하는 것이라고 생각하지 않는다. 이전 트리 노드를 지울 것 같습니다. 예를 들어 ID 12400은 ID 12430의 상위 노드이므로 다음과 같은 노드를 설정하려고합니다. $ tree [1] [2] [4] [ 'id'] = '12400'; $ tree [1] [2] [4] [3] [ 'id'] = '12430'; – gr8dane

0

변수가 무엇인지 알 수는 없지만 배열을 작성하기 위해 참조를 사용하여 작동해야하는 질문에 기반합니다. 누군가 게시 할 예정입니다 재귀 하나

function addKeys($id) { 
    $result = array(); 
    $temp =& $result; 

    foreach(str_split($id) as $key) { 
     if($key != 0) { 
      $temp =& $temp[$key]; 
     } 
    } 
    $temp['id'] = $id; 

    return $result; 
} 

$id = '12430';  
$tree = addKeys($id);  
print_r($tree); 
+0

나는 이것이 내가하려고하는 것이라고 생각하지 않는다. 이전 트리 노드를 지울 것 같습니다. 예를 들어 ID 12400은 ID 12430의 부모이므로 다음과 같이 노드를 설정하려고합니다. $ tree [1] [2] [4] [ 'id'] = '12400'; $ tree [1] [2] [4] [3] [ 'id'] = '12430'; – gr8dane

+0

그 질문에 포함시킬 관련 정보가 있었습니까? – AbraCadaver

+0

제 질문의 두 번째 문장을 다시 한 번 살펴보십시오. 그것은 거기에 있습니다. 단지 자세히는 아닙니다. 나는 장황한 것보다 더 간결 해지는 경향이 있다고 생각한다. 이 경우에는 미덕이 아닙니다. – gr8dane