Je me suis récemment trouvé face à ce problème, et je crois avoir trouvé la solution. Je reviendrai sur le problème lui-même, et aussi la solution, en essayant d'expliquer tout le long du chemin. Le problème était que je n'avais pas de tableau à deux dimensions, mais un tableau qui pouvait avoir un nombre quelconque de tableaux à l'intérieur des tableaux, donc la solution de Brad F Jacobs ne pouvait pas s'appliquer ici, bien que ce soit très simple et fonctionnel.
Je devais travailler avec une table de base de données auto-référencée appelée 'page Web', où l'une des colonnes était 'parentWebpageId', qui faisait référence à un Id d'une autre ligne dans cette même table. De cette façon, une structure en arbre peut être construite et facilement gérée, si vous obtenez vos boucles correctement. J'ai facilement créé une fonction qui est censée générer un tableau multidimensionnel à partir d'un tableau d'auto-référencement unidimensionnel, mais le problème est survenu lorsque j'ai essayé de faire une fonction qui devrait être contraire. J'avais besoin de cela parce que si je voulais supprimer une certaine page Web, tous ses enfants devraient également être supprimés, afin de préserver l'intégrité autoréférentielle.
Il était facile de générer un arbre dont la racine était la page qui devait initialement être supprimée, mais j'avais besoin d'une liste des ID de toutes les pages web de l'enfant, afin de les supprimer toutes.
Ainsi, la structure que j'avais été quelque chose comme ceci:
webpage1
id
title
...
childWebpageArray
webpage2
id
title
...
childWebpageArray
webpage2.1
id
url
...
childWebpageArray
webpage2.2
id
url
...
childWebpageArray
webpage2.2.1
id
url
...
childWebpageArray
webpage2.2.2
id
url
...
childWebpageArray
webpage2.3
id
url
...
childWebpageArray
webpage3
id
title
...
childWebpageArray
Comme vous pouvez le voir, la profondeur peut aller pour toujours.
Ce que je suis venu avec est la suivante:
function flattenMultidimensionalArray($multidimensionalArray) {
// Set anchor.
ohBoyHereWeGoAgain:
// Loop through the array.
foreach ($multidimensionalArray as $key1 => $value1) {
// Check if the webpage has child webpages.
if (isset($multidimensionalArray[$key1]["childWebpageArray"]) && (count($multidimensionalArray[$key1]["childWebpageArray"]) > 0)) {
// If it does, loop through all the child webpages, and move them into the initial multi-dimensional array.
foreach ($multidimensionalArray[$key1]["childWebpageArray"] as $key2 => $value2) {
$multidimensionalArray[] = $multidimensionalArray[$key1]["childWebpageArray"][$key2];
}
// Unset element's child pages, because all those child pages, along with their child pages
// have been moved into the initial array, thus reducing the depth of a multi-dimensional array by 1.
unset($multidimensionalArray[$key1]["childWebpageArray"]);
}
}
// Loop once again through the whole initial array, in order to check if any of the pages has children
foreach ($multidimensionalArray as $key => $value) {
// If a page which has children is found, kick the script back to the beginning, and go through it again.
if (isset($multidimensionalArray[$key]["childWebpageArray"]) && (count($multidimensionalArray[$key]["childWebpageArray"]) > 0)) {
goto ohBoyHereWeGoAgain;
}
}
// In the end, when there are no more pages with children, return an array of pages.
return $multidimensionalArray;
}
Cette solution a fonctionné dans mon cas, et je crois est la bonne pour ce genre de problème. Il n'est probablement pas très compliqué de le changer pour répondre à vos besoins particuliers.
Espérons que cela aide!
De quel 'avez-vous besoin? La fusion des deux tableaux écrase l'index a avec le dernier tableau analysé. Pourriez-vous donner un exemple de ce que vous vouliez que la fonction retourne? –
J'aurais besoin d'eux tous les deux, mais en tant que tableau unidimensionnel. – Toby
Cela devrait être bien ... y at-il un problème avec le code, erreur ou autre? Il serait utile que vous nous montriez votre état final désiré. –