Transformer un tableau multidimensionnel en tableau unidimensionnel

Soyez le premier à donner votre avis sur cette source.

Vue 10 458 fois - Téléchargée 111 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
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
Lol bon, je laisse tomber.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
http://fr.wikipedia.org/wiki/Programmation_fonctionnelle

php ne remplie clairement pas les criteres...
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
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.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
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
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
24
@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.