Transformer un tableau multidimensionnel en tableau unidimensionnel

Soyez le premier à donner votre avis sur cette source.

Vue 11 205 fois - Téléchargée 124 fois

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

Ajouter un commentaire Commentaires
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 déc. 2007 à 14:38
Lol bon, je laisse tomber.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
26 déc. 2007 à 14:22
http://fr.wikipedia.org/wiki/Programmation_fonctionnelle

php ne remplie clairement pas les criteres...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 déc. 2007 à 14:16
J'ai pas dit le contraire ? J'ai dit que tu pouvais sans problème simuler le même comportement. je n'ai jamais dit que "function" était un type en php.
Il n'en reste pas moins que is_callable() sur $test renverra true.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
26 déc. 2007 à 13:47
et ton gettype te renvoie string, function c'est pas un type de base en php... si tu te promenes du cote de caml ou autre, tu verras c'est autre chose le fonctionnel
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
26 déc. 2007 à 13:38
@Coucou => c'est ce que je disais, tu réflêchis en mode javascript en faisant du php. Tu ne simules pas correctement ta fonction :
<?php
function add($a){
return create_function('$b', 'return '.$a.'+$b;');
}

$test=add(5);
echo $test(3);
?>
Afficher les 19 commentaires

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.