Transformer un tableau multidimensionnel en tableau unidimensionnel

Description

Quand je me suis retrouvé devant le problème de devoir gérer un tableau à X dimensions sans connaître X je me suis naturellement tourné vers la doc PHP mais je n'ai rien trouvé! J'ai donc développé ma propre fonction.

Il n'y a rien à paramétrer, il suffit juste de donner le tableau multidimensionnel et ma fonction vous ressortira un tableau unidimensionnel.

En espérant que cela pourra aider.

Source / Exemple :


<?php

//Tableau multidimensionnel que l'on désire transformer en tableau unidimensionnel
$a = array ("a", "b", array ("zz", "yy", array ("aaa", "aab", array ("bbc1", "bbc2", "bbc3"))), "c", "d", array ("zza", "zzb", "zzc", "zzd", array ("yya", "yyb", "yyc", array ("xxa", "xxb", array ("wwa", "wwb", "wwc"))), "zze"), "e", "f");

echo "tableau source : ";
print_r ($a);
echo "<br><br><br>";

//On compte le nombre d'éléments contenus dans tous les tableaux
$compte_tout_tableau = count ($a, 1);

//On stocke les chemins amenant à un sous tableau
$stock_tableau = array();

//Tableau de sortie que l'on pourra travailler après
$recup_donnees = array();

//On va tester de manière récursive toutes les clefs et déterminer s'il s'agit d'un sosu tableau ou non
for ($b=0;$b<=$compte_tout_tableau;$b++) {

	//On traite le 1er niveau
	if (empty ($stock_tableau) || empty ($niveau)) {
		$valeur_courante = current ($a);
		next ($a);

		//On regarde si c'est un tableau. Si c'est le cas on stocke le chemin dans le tableau $stock_tableau sinon on stocke la valeur dans $recup_donnees. Si on a atteint la fin du 1er niveau du tableau on met une
		//séparation et on passe au 2ème niveau
		if (is_array ($valeur_courante)) {
			$clef = array_search ($valeur_courante, $a);
			array_push ($stock_tableau, $clef);
		} else if (empty ($valeur_courante)) {
			array_push ($stock_tableau, "/,,/");
			array_push ($recup_donnees, "/,,/");
			$niveau = 1;
		} else {
			array_push ($recup_donnees, $valeur_courante);
		}
	
	//On traite les niveaux supérieurs
	} else {
		//On récupère le chemin indiquant un sous dossier
		$valeur_courante2 = current ($stock_tableau);
		next ($stock_tableau);
		
		//Niveau 3 et supérieur
		if (is_array ($valeur_courante2)) {

			//On compte le nombre de valeurs contenu dans le tableau unidimensionnel contenu dans la variable $valeur_courante2
			$compte_tableau3 = count ($valeur_courante2);

			//On copie le tableau pour le triturer et ainsi ne pas abîmer le tableau original
			$resultat2 = $a;

			//On récupère la dernière valeur du tableau $valeur_courante2
			$valeur_fin2 = end ($valeur_courante2);

			//On récupère la ou les clef(s) correspondant à la dernière valeur du tableau $valeur_courante2
			$valeur_fin3 = array_keys ($valeur_courante2, $valeur_fin2);

			//On regarde s'il y a plus d'une clef pour la dernière valeur et si oui, on récupère la dernière
			if (count ($valeur_fin3) > 1) {
				$valeur_fin = end ($valeur_fin3);
			} else {
				$valeur_fin = $valeur_fin3[0];
			}
			
			//On épeluche le tableau $resultat2 pour obtenir le morceau désiré
			for ($d=0;$d<$compte_tableau3;$d++) {
				//Le +0 est très important sinon le résultat obtenu sera tout autre 
				$resultat2 = $resultat2[$valeur_courante2[$d]+0];
			}
			
			//On compte le nombre de valeurs restantes
			$compte_tableau4 = count ($resultat2);

			//On regarde pour chaque clef si la valeur est un tableau ou une simple valeur
			for ($e=0;$e<$compte_tableau4;$e++) {
				//Si on a un tableau on sort du tableau renvoyé le chemin auquel on ajoute le dernier tronçon, la dernière clef et on remet tout dans un tableau stocké dans $stock_tableau
				if (is_array ($resultat2[$e])) {
					$clef3 = array_search ($resultat2[$e], $resultat2);
					$boom = implode (",", $valeur_courante2);
					$boom2 = "$boom, $clef3";
					$colle = explode (",", $boom2);
					array_push ($stock_tableau, $colle);
				} else {
					//Si on a une valeur on la stocke dans $recup_donnees
					array_push ($recup_donnees, $resultat2[$e]);
				}
			}
		
		//Une fois le niveau courant terminé (2ème ou supérieur) on met une séparation et l'on passe au niveau suivant
		} else if (empty ($valeur_courante2) || !is_numeric($valeur_courante2)) {
			$verif = count ($stock_tableau)-1;
			
			if ($stock_tableau[$verif] != "/,,/") {
				array_push ($stock_tableau, "/,,/");
				array_push ($recup_donnees, "/,,/");
			}

		//Niveau 2
		} else {
			//On compte le nombre de clefs pour arriver au tableau indiqué dans $stock_tableau
			$compte_tableau2 = count ($a[$valeur_courante2]);
			
			//On récupère la valeur courante
			$resultat = $a[$valeur_courante2];

			//On tri à nouveau pour savoir si la valeur renvoyée est un tableau ou une valeur. tableau = $stock_tableau, valeur = $recup_donnees
			for ($c=0;$c<$compte_tableau2;$c++) {
				if (is_array ($resultat[$c])) {
					$clef2 = array_search ($resultat[$c], $resultat);
					array_push ($stock_tableau, array ($valeur_courante2, $clef2));
				} else {
					array_push ($recup_donnees, $resultat[$c]);
				}
			}
		}
	}
}

echo "<br><br><br>";
echo "Contenu du tableau ".'$recup_donnees : ';
print_r ($recup_donnees);

?>

Conclusion :


Ce petit script m'a en fait servi de squelette pour transformer un tableau d'objets renvoyé par la fonction imap_fetchstructure pour la gestion d'un webmail que j'avais développé il y a quelques années et que je remets à jour (http://r-mail.sourceforge.net)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.