私は多くの検索を行いましたが、良い解決策を見つけることができません。
次のような動的に生成された配列があります。
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] などのように存在せず、直接次のレベルになることは問題ありません。
また、テーブルが生成されるファイル名にこのシナリオを含めることもできます
a%2Faaaa%2Fa bb%2Fb b%2Faa%2Fa
デバッグを容易にするために、現在の順序で並べただけです。
@erwin-haasnoot
意図した動作は
Array (
[0] => Array ( [a] => Array ( [aa] => Array ( [0] => aab )
[ab] => Array ( [0] => aba )
)
[b] => Array ( [0] => abb )
)
[1] => Array ( [b] => Array ( [0] => bba ) )
)
考え方としては一番左の値が左から右に文字列の親子です。
別の世代と同じ名前の親は存在しない可能性があり、その世代の親には同じ名前の子がいない可能性があります。
ただし、子は親と同じ名前である場合や、他の親に属する他の子と同じ場合があります。
すべての親が子供を持つわけではありません。
すべての子供が次世代の親になるわけではありません。
親と子の世代数に制限はありません。