2012-04-24 58 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;