2012-04-24 4 views
2

많은 검색을 수행했지만 좋은 해결책을 찾을 수 없습니다.PHP 다차원 배열 키로 중복 제거

I는 이와 같이 동적으로 생성 된 배열을 가지고

I 각 레벨에서 모든 중복 값을 제거하면된다 싶은
Array (
    [0] => Array ([0] => a) 
    [1] => Array ([a] => Array ([0] => aa)) 
    [2] => Array ([a] => Array ([aa] => Array ([0] => aaa))) 
    [3] => Array ([a] => Array ([aa] => Array ([0] => aab))) 
    [4] => Array ([a] => Array ([ab] => Array ([0] => aba))) 
    [5] => Array ([0] => b) 
    [6] => Array ([b] => Array ([0] => bb))) 

(어레이는 크거나 작은 치수가 될 수있다)과 유사한 결과를 생성 할 :

Array (
    [0] => Array ([a] => Array ([aa] => Array ([0] => aaa 
                [1] => aab) 
            [ab] => Array ([0] => aba) 
           ) 
       ) 
    [1] => Array ([b] => Array ([0] => bb) 
       ) 
    ) 

나는 그것을 다루는 여러 재귀 함수 (아래 예) 만들기 시도했지만 아직 원하는 효과를 얻는 방법을 알아낼 수 없었다, 고장에 따른 그들 모두를 삭제했다.

function deduplicateArray(&$varTemp) } 
    if (is_array($varTemp)) { 
    foreach($varTemp as $key => &$value) { 
    if (is_array($value)) { 
     // do stuff. 
     deduplicateArray($value); 
     } else { 
     // do stuff. 
     } 
    } 
    } else { 
    // do stuff. 
    } 
} 

올바른 방향으로도 도움이됩니다. 감사합니다.

편집 :

어레이가 구분 %에 2 층을 이용하여 적절히 명명 된 파일로부터 생성되고,이 코드에 의해 생성된다.

function generateStructure(&$arrStructure, $strContent, $strBaseURL, $strPageURL) {  // Generate Content Structure Code. 
    if ($arrStructure === array(NULL)) { 
    $arrStructure = array('');       // Define Final Array. 
    if ($dirTemp = opendir($strContent)) { 
     while (false !== ($strFile = readdir($dirTemp))) { 
     if ($strFile != '.' && $strFile != '..') { 
      if (is_file($strContent.$strFile) && substr_count($strFile, '.php') > 0) { // Make sure is file and is php. 
      if (isset($arrFiles)) { 
       array_push($arrFiles, strtok($strFile, '.php')); 
      } else { 
       $arrFiles = array(strtok($strFile, '.php')); 
      } 
      } 
     } 
     } 
     closedir($dirTemp); 
    } else { 
     errorCode(403); 
    } 
    sort($arrFiles); // Put in Alphabetical Order 
    $intTemp = 0; 
    for ($i = 0; $i < count($arrFiles); $i++) { 
     $arrTempSplit = explode('%2F',$arrFiles[$i]);  // Create an Array of Strings from FileName String by Delimiter. 

     $ii = count($arrTempSplit) - 1;      // Create integer that is equal to the potential Multi-Dimensional Array's Columns. 
     //if ($ii > $intTemp) { 
     // $intTemp = $ii;         // Get highest elementt for The Final Array. 
     //} 

     $arrTemp=array($arrTempSplit[$ii]);     // Turn current Element into Array. 
     $ii--; 

     for($ii; $ii >= 0 ; $ii--) {       // Loop through the Multi-Dimentional Array from Right to Left. 
     $arrTemp2 = array($arrTempSplit[$ii] => $arrTemp); 
     unset($arrTemp); 
     $arrTemp = &$arrTemp2; 
     } 

     // Deduplicate Multi-Dimensional Array. 
     //if ($i > 0 && is_array($arrStructure[$i])) { 
     // $arrStructure[$i] = array_merge_recursive($arrTemp, $arrStructure[$i-1]); 
     //} else { 
     $arrStructure[$i] = $arrTemp; 
     //} 
    } 
    //$arrStructure = array_unique($arrStructure); 
    deduplicateArray($arrStructure); 
    print_r($arrStructure); 
    } 
} 

그 확인 최상위 어레이 [0] [1] [2] 등 단지 직접 다음 단계 수로 존재 여부에 대한.

또한 % 2Faa이 AA가 % 2FA BB %의 2Fb ㄴ %의 2Faa의 %가 2FA

나는 단지 그들이 주문한 테이블

생성되는 파일 이름에이 시나리오를 가질 수 있습니다 순서대로 디버깅하기 쉽도록 만듭니다.

어윈 - haasnoot

@ 의도 된 동작은

Array ( 
     [0] => Array ([a] => Array ([aa] => Array ([0] => aab) 
             [ab] => Array ([0] => aba) 
            ) 
         [b] => Array ([0] => abb) 
        ) 
     [1] => Array ([b] => Array ([0] => bba)) 
    ) 

그것을 생각하는 방법이 가장 왼쪽 값에서 문자열이 부모와 자식 왼쪽에서 오른쪽입니다 것입니다.

다른 세대와 이름이 같은 부모가 없을 수 있으며 해당 세대의 부모에게는 이름을 공유하는 자식이 없을 수 있습니다.

그러나 아이들은 부모와 같은 이름 일 수도 있고 다른 부모에게 속한 다른 아이들 일 수도 있습니다.

모든 부모가 자녀를 가질 수있는 것은 아닙니다.

모든 어린이가 다음 세대의 부모가 될 수있는 것은 아닙니다.

부모 및 자녀의 세대 수에는 제한이 없습니다.

+0

당신은 최고 수준의 배열에 array_unique를 실행하면 어떻게됩니까은 : http://php.net/manual/en/function.array-unique.php –

+0

인가 가지 사이에 반복되는 열쇠가있을 위험이 있습니까? 예를 들어, 핵심 배열'$ array [6] [ 'b'] [ 'aa']'가있을 수 있습니까? – DaveRandom

+0

@MatthewRiches Array ([0] => Array ([0] => a)) –

답변

0

아직 답변을 드릴 수 없기 때문에 답변을해야합니다.

문제가 매우 잘 정의되어 있다고 생각하지 않습니다. 예를 들어이 경우 예상되는 동작은 무엇입니까?

Array ( 
[0] => Array ([a] => Array ([0] => aa)) 
[1] => Array ([a] => Array ([aa] => Array ([0] => aaa))) 
[2] => Array ([a] => Array ([aa] => Array ([0] => aab))) 
[3] => Array ([a] => Array ([ab] => Array ([0] => aba))) 
[4] => Array ([0] => a) 
[5] => Array ([0] => b) 
[6] => Array ([b] => Array ([0] => bb))) 

수치 '키'를 수행 (이다 basicly와 indices, 또는 할 수있다) 밖으로 던져 : (값이 'A'대신에 키입니다 배열 봐)? 아니면 키 = 'A는'

이 같은 배열의 의도 된 행동이란 배열 덮어 않습니다

Array ( 
[0] => Array ([a] => Array ([aa] => Array ([0] => aab))) 
[1] => Array ([a] => Array ([ab] => Array ([0] => aba))) 
       [b] => Array ([0] => abb) 
[2] => Array ([b] => Array ([0] => bba)) 
) 

을 그리고 제가 적용되지 않는 많은 다른 예를 생각할 수있는 확신 당신의 본보기로 당신이 이것을 통해 생각할 수 있다면 나는 당신이 당신의 실제 솔루션에 한 걸음 더 가까워 질 것이라고 생각합니다.

+0

이 시나리오를 보여줄 수있는 질문을 업데이트했으며 모든 가능성을 충분히 고려했습니다. –

0

이 함수는 도움이 될 것입니다. 저는 아직 정확히 어떻게 작동 하는지를 알고 있습니다.

편집 : SOURCE : http://sebastiano.ezion.cc/2008/03/13/php-foreach-function-for-multi-level-arrays/#

$buff = ""; 
function foreach_loop($array) { 
global $buff; 

    foreach ($array as $key => $value) { 
     if (!is_array($value)) { // if it isn't an array show $key and $value 
       $buff .= ' ' . $key; 
       $buff .= ' -> ' . $value . '<br> '; 
     }else { // if it is an array -> show $key -> then process $value again will same function. 
       $buff .= '<strong>' . $key.'</strong> '; 
       foreach_loop($value); 
     } 
    } 
} 

foreach_loop($oldarray); 
echo $buff;