我做了很多搜索,但無法找到一個好的解決方案。通過密鑰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))
)
想它的方式是從左側最左邊的值向右字符串是父母和孩子。
可能沒有與另一個同名的父代,並且該代的父代可能沒有任何共享名稱的子代。
但是,孩子可能與其父母以及屬於其他父母的其他孩子名字相同。
並非所有的父母都可能有孩子。
並非所有的孩子都可能是下一代的父母。
家長和孩子的世代數量沒有限制。
當您運行頂層陣列上array_unique會發生什麼:http://php.net/manual/en/function.array-unique.php – 2012-04-24 13:29:18
是分支之間有重複鍵的危險?例如,是否可以有一個關鍵的'$ array [6] ['b'] ['aa']'? – DaveRandom 2012-04-24 14:00:19
@MatthewRiches數組([0] =>數組([0] => a)) – 2012-04-24 14:06:26