我做了很多搜索,但无法找到一个好的解决方案。
我有一个动态生成的数组,如:
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 :(得分: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 ) ) )
数字'键'(哪些指数基本上是,或可以)被抛出?或者它是否覆盖了key ='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 ) )
)
而且我确信我能想到许多其他未被您自己的例子所涵盖的例子。如果你能想到这些,我认为你将更接近你的实际解决方案。
答案 1 :(得分: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;