2012-04-24 168 views
2

我做了很多搜索,但無法找到一個好的解決方案。通過密鑰PHP多維陣列重複數據刪除

我有一個動態產生的陣列,例如這樣的:

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. 
    } 
} 

即使只是在正確的方向點將有所幫助,謝謝。

編輯:

被該代碼是從使用%2F作爲分隔符相應的文件創建產生的陣列。

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 B%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 – 2012-04-24 13:29:18

+0

是分支之間有重複鍵的危險?例如,是否可以有一個關鍵的'$ array [6] ['b'] ['aa']'? – DaveRandom 2012-04-24 14:00:19

+0

@MatthewRiches數組([0] =>數組([0] => a)) – 2012-04-24 14:06:26

回答

0

因爲我還沒有被允許回覆,所以我必須在回答中做。

我不認爲你的問題是非常明確的,例如,在這種情況下預期的行爲是什麼?(看看數組,其中的值是「A」代替鍵):

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是,或可以)拋出了呢?或者它覆蓋數組,其中鍵=「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

我已更新該問題以顯示此場景,並希望涵蓋所有可能性。 – 2012-04-24 14:46:39

0

這個功能會有幫助,我還在研究如何。

編輯:來源: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;