Accueil > > > TRANSFORMER UN TABLEAU D'OBJETS EN TABLEAU UNIDIMENSIONNEL
TRANSFORMER UN TABLEAU D'OBJETS EN TABLEAU UNIDIMENSIONNEL
Information sur la source
Description
Pour les besoins d'un webmail que je remets à jour j'avais besoin de traiter les tableaux d'objets renvoyés par la fonction imap_fetchstructure. Il existe quelques exemples sur le site de PHP (www.php.net) mais rien en procéduriel, que de l'objet et moi, l'objet, ça me file des boutons! J'ai donc décidé de développé ma propre fonction. Le principe est de traiter le tableau d'objet par niveau. Le faire de manière naturelle, comme un humain lierait le tableau aurait été beaucoup trop dur pour moi. Afin de s'y retrouver ma fonction renomme chaque clef en récupérant le nom d'objet de la valeur traitée.
Source
- <?php
-
- //$a est un tableau d'objets renvoyé par la fonction imap_fetch_structure
-
- //On liste dans un tableau tous les objets renvoyés par la fonction
- $valeurs_objet = array ("type", "encoding", "ifsubtype", "subtype", "ifdescription", "descritpion", "ifid", "id", "lines", "bytes", "ifdisposition", "disposition", "ifdparameters", "dparameters", "ifparameters", "parameters", "parts");
-
- print_r ($a);
- echo "<br><br><br>";
-
- //On stocke les chemins amenant à un sous tableau
- $stock_tableau = array();
-
- //Tableau de sortie que l'on pourra travailler après
- $recup_donnees = array();
-
- //Variable incrémentable pour le premier niveau qui servira a appelé les noms d'objets contenus dans $valeur_objet
- $numero = 0;
-
- //On fait tourner la boucle tant que le tableau d'objets $a n'a pas entièrement été lu
- while (!$arret_boucle) {
-
- //On traite le 1er niveau
- if (empty ($stock_tableau) || empty ($niveau)) {
-
- if ($numero<17) {
- //On récupère la valeur courante de $a
- $valeur_courante = $a -> $valeurs_objet[$numero];
-
- //Si la valeur courante est un tableau on stocke le chemin dans $stock_tableau
- if (is_array ($valeur_courante)) {
- array_push ($stock_tableau, $valeurs_objet[$numero]);
- } else {
- //Si la valeur courante est une simple valeur on la stocke avec le nom d'objet en clef dans le tableau $recup_donnees
- if (isset ($valeur_courante)) {
- $recup_donnees[$valeurs_objet[$numero]] = $valeur_courante;
- }
- }
- $numero++;
- //Si le premier niveau est terminé on met un séparateur et l'on passe au 2ème niveau
- } else {
- array_push ($stock_tableau, "/,,/");
- array_push ($recup_donnees, "/,,/");
- $niveau = 1;
- }
-
- //On traite les niveaux supérieurs
- } else {
- $valeur_courante2 = current ($stock_tableau);
- next ($stock_tableau);
-
- //Niveau 3 et supérieur
- if (is_array ($valeur_courante2)) {
- //On compte le nombre de valeurs contenues dans le tableau
- $compte_tableau3 = count ($valeur_courante2);
-
- //On copie le tableau pour le triturer afin de ne pas abîmer le tableau original
- $resultat2 = $a -> parts;
-
- //On épluche le tableau $resultat2 pour obtenir le morceau désiré
- for ($d=0;$d<$compte_tableau3;$d++) {
- //La distinction est obligatoire car le compilateur ne reconnaît pas les appels du genre $truc->$a->$b. Il faut préciser $a et $b si ce sont des objets
- if ($d%2 == 0) {
- //Le +0 est très important sinon le résultat obtenu sera tout autre. On teste la valeur courante appelée afin de déterminer s'il s'agit d'un objet ou d'un tableau
- $resultat2 = $resultat2[$valeur_courante2[$d]+0];
- } else {
- //On définit le saut suivant
- if ($valeur_courante2[$d] == "parameters") {
- $resultat2 = $resultat2->parameters;
- } else if ($valeur_courante2[$d] == "dparameters") {
- $resultat2 = $resultat2->dparameters;
- } else if ($valeur_courante2[$d] == "parts") {
- $resultat2 = $resultat2->parts;
- }
- }
- }
-
- //On compte le nombre de valeurs contenues dans le tableau épluché
- $compte_resultat2 = count ($resultat2);
-
- //On compte le nombre de valeurs du tableau contenu dans la variable $valeur_courante2
- $compte_valeur_courante2 = count ($valeur_courante2);
-
- //On analyse la valeur courante du tableau $resultat2
- for ($e=0;$e<$compte_resultat2;$e++) {
-
- //permet d'incrémenter les différentes clefs attribute et value
- $g = $c++;
-
- //On regarde si la valeur courante est parameters ou dparameters afin de récupérer les valeurs de attribute et value avec les noms d'objets en clef indexés
- if (strcmp ($valeur_courante2[$compte_valeur_courante2-1], "parameters") == 0 || strcmp ($valeur_courante2[$compte_valeur_courante2-1], "dparameters") == 0) {
- $recup_donnees[attribute.$g] = $resultat2[$e] -> attribute;
- $recup_donnees[value.$g] = $resultat2[$e] -> value;
-
- //idem pour parts. Dans ce cas on teste toutes les valeurs derrière parts afin de déterminer s'il y a un tableau d'objet ou une simple valeur
- } else if (strcmp ($valeur_courante2[$compte_valeur_courante2-1], "parts") == 0) {
- for ($i=0;$i<17;$i++) {
- //On vérifie que l'objet existe
- if (isset ($resultat2[$e] -> $valeurs_objet[$i])) {
- //Si la valeur retournée est un tableau on réupère le chemin, on ajoute la dernière clef, on injecte le tout dans un tableau que l'on met dans $stock_tableau
- if (is_array ($resultat2[$e] -> $valeurs_objet[$i])) {
- $boom = implode (",", $valeur_courante2);
- $boom2 = "$boom, $e,$valeurs_objet[$i]";
- $colle = explode (",", $boom2);
- array_push ($stock_tableau, $colle);
- //Si la clef contient une simple valeur on la stocke dans $recup_donnees
- } else {
- $recup_donnees[$valeurs_objet[$i].$g] = $resultat2[$e] -> $valeurs_objet[$i];
- }
- }
- }
- }
- }
-
- //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) || $valeur_courante2 == "/,,/") {
- $verif = count ($stock_tableau)-1;
-
- if ($stock_tableau[$verif] != "/,,/") {
- array_push ($stock_tableau, "/,,/");
- array_push ($recup_donnees, "/,,/");
-
- //Si tout le tableau d'objet a été lu on arrête la boucle
- } else {
- $arret_boucle = 1;
- }
-
- //Niveau 2
- } else {
- //On récupère la valeur courante
- $resultat = $a -> $valeur_courante2;
-
- //On compte le nombre d'éléments contenu dans le tableau
- $compte_tableau2 = count ($resultat);
-
- //On teste toutes les clefs du tableau afin de savoir si la valeur est un tableau, un objet ou une simple valeur
- for ($c=0;$c<$compte_tableau2;$c++) {
- //Si la valeur courante est parameters on stocke son contenu dans $recup_donnees et on met le nom des objets en clefs suivi d'un indice numérique pour ne pas que le compilateur considère
- //qu'il n'y ait qu'une seule clef et donc qu'une seule valeur
- if ($valeur_courante2 == "parameters") {
- $recup_donnees[attribute.$c] = $resultat[$c] -> attribute;
- $recup_donnees[value.$c] = $resultat[$c] -> value;
- //idem si la valeur courante est dparameters
- } else if ($valeur_courante2 == "dparameters") {
- $recup_donnees[attribute.$c+1] = $resultat[$c] -> attribute;
- $recup_donnees[value.$c+1] = $resultat[$c] -> value;
- //Si la valeur courante est parts on recommence à tester toutes les valeurs contenues après parts pour savoir si les clefs contiennent des objets ou de simples valeurs
- } else if ($valeur_courante2 == "parts") {
- for ($f=0;$f<17;$f++) {
- //On vérifie que l'objet courant appelé existe
- if (isset ($resultat[$c] -> $valeurs_objet[$f])) {
- //Si l'objet courant appelé est un tableau on stocke le chemin dans $stock_tableau, sinon on inscrit la valeur dans $recup_donnees
- if (is_array ($resultat[$c] -> $valeurs_objet[$f])) {
- array_push ($stock_tableau, array ($c, $valeurs_objet[$f]));
- } else {
- $recup_donnees[$valeurs_objet[$f].$c] = $resultat[$c] -> $valeurs_objet[$f];
- }
- }
- }
- }
- }
- }
- }
- }
-
- echo "<br><br><br>";
- echo "recup_donnees : ";
- print_r ($recup_donnees);
-
- }
-
- ?>
<?php
//$a est un tableau d'objets renvoyé par la fonction imap_fetch_structure
//On liste dans un tableau tous les objets renvoyés par la fonction
$valeurs_objet = array ("type", "encoding", "ifsubtype", "subtype", "ifdescription", "descritpion", "ifid", "id", "lines", "bytes", "ifdisposition", "disposition", "ifdparameters", "dparameters", "ifparameters", "parameters", "parts");
print_r ($a);
echo "<br><br><br>";
//On stocke les chemins amenant à un sous tableau
$stock_tableau = array();
//Tableau de sortie que l'on pourra travailler après
$recup_donnees = array();
//Variable incrémentable pour le premier niveau qui servira a appelé les noms d'objets contenus dans $valeur_objet
$numero = 0;
//On fait tourner la boucle tant que le tableau d'objets $a n'a pas entièrement été lu
while (!$arret_boucle) {
//On traite le 1er niveau
if (empty ($stock_tableau) || empty ($niveau)) {
if ($numero<17) {
//On récupère la valeur courante de $a
$valeur_courante = $a -> $valeurs_objet[$numero];
//Si la valeur courante est un tableau on stocke le chemin dans $stock_tableau
if (is_array ($valeur_courante)) {
array_push ($stock_tableau, $valeurs_objet[$numero]);
} else {
//Si la valeur courante est une simple valeur on la stocke avec le nom d'objet en clef dans le tableau $recup_donnees
if (isset ($valeur_courante)) {
$recup_donnees[$valeurs_objet[$numero]] = $valeur_courante;
}
}
$numero++;
//Si le premier niveau est terminé on met un séparateur et l'on passe au 2ème niveau
} else {
array_push ($stock_tableau, "/,,/");
array_push ($recup_donnees, "/,,/");
$niveau = 1;
}
//On traite les niveaux supérieurs
} else {
$valeur_courante2 = current ($stock_tableau);
next ($stock_tableau);
//Niveau 3 et supérieur
if (is_array ($valeur_courante2)) {
//On compte le nombre de valeurs contenues dans le tableau
$compte_tableau3 = count ($valeur_courante2);
//On copie le tableau pour le triturer afin de ne pas abîmer le tableau original
$resultat2 = $a -> parts;
//On épluche le tableau $resultat2 pour obtenir le morceau désiré
for ($d=0;$d<$compte_tableau3;$d++) {
//La distinction est obligatoire car le compilateur ne reconnaît pas les appels du genre $truc->$a->$b. Il faut préciser $a et $b si ce sont des objets
if ($d%2 == 0) {
//Le +0 est très important sinon le résultat obtenu sera tout autre. On teste la valeur courante appelée afin de déterminer s'il s'agit d'un objet ou d'un tableau
$resultat2 = $resultat2[$valeur_courante2[$d]+0];
} else {
//On définit le saut suivant
if ($valeur_courante2[$d] == "parameters") {
$resultat2 = $resultat2->parameters;
} else if ($valeur_courante2[$d] == "dparameters") {
$resultat2 = $resultat2->dparameters;
} else if ($valeur_courante2[$d] == "parts") {
$resultat2 = $resultat2->parts;
}
}
}
//On compte le nombre de valeurs contenues dans le tableau épluché
$compte_resultat2 = count ($resultat2);
//On compte le nombre de valeurs du tableau contenu dans la variable $valeur_courante2
$compte_valeur_courante2 = count ($valeur_courante2);
//On analyse la valeur courante du tableau $resultat2
for ($e=0;$e<$compte_resultat2;$e++) {
//permet d'incrémenter les différentes clefs attribute et value
$g = $c++;
//On regarde si la valeur courante est parameters ou dparameters afin de récupérer les valeurs de attribute et value avec les noms d'objets en clef indexés
if (strcmp ($valeur_courante2[$compte_valeur_courante2-1], "parameters") == 0 || strcmp ($valeur_courante2[$compte_valeur_courante2-1], "dparameters") == 0) {
$recup_donnees[attribute.$g] = $resultat2[$e] -> attribute;
$recup_donnees[value.$g] = $resultat2[$e] -> value;
//idem pour parts. Dans ce cas on teste toutes les valeurs derrière parts afin de déterminer s'il y a un tableau d'objet ou une simple valeur
} else if (strcmp ($valeur_courante2[$compte_valeur_courante2-1], "parts") == 0) {
for ($i=0;$i<17;$i++) {
//On vérifie que l'objet existe
if (isset ($resultat2[$e] -> $valeurs_objet[$i])) {
//Si la valeur retournée est un tableau on réupère le chemin, on ajoute la dernière clef, on injecte le tout dans un tableau que l'on met dans $stock_tableau
if (is_array ($resultat2[$e] -> $valeurs_objet[$i])) {
$boom = implode (",", $valeur_courante2);
$boom2 = "$boom, $e,$valeurs_objet[$i]";
$colle = explode (",", $boom2);
array_push ($stock_tableau, $colle);
//Si la clef contient une simple valeur on la stocke dans $recup_donnees
} else {
$recup_donnees[$valeurs_objet[$i].$g] = $resultat2[$e] -> $valeurs_objet[$i];
}
}
}
}
}
//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) || $valeur_courante2 == "/,,/") {
$verif = count ($stock_tableau)-1;
if ($stock_tableau[$verif] != "/,,/") {
array_push ($stock_tableau, "/,,/");
array_push ($recup_donnees, "/,,/");
//Si tout le tableau d'objet a été lu on arrête la boucle
} else {
$arret_boucle = 1;
}
//Niveau 2
} else {
//On récupère la valeur courante
$resultat = $a -> $valeur_courante2;
//On compte le nombre d'éléments contenu dans le tableau
$compte_tableau2 = count ($resultat);
//On teste toutes les clefs du tableau afin de savoir si la valeur est un tableau, un objet ou une simple valeur
for ($c=0;$c<$compte_tableau2;$c++) {
//Si la valeur courante est parameters on stocke son contenu dans $recup_donnees et on met le nom des objets en clefs suivi d'un indice numérique pour ne pas que le compilateur considère
//qu'il n'y ait qu'une seule clef et donc qu'une seule valeur
if ($valeur_courante2 == "parameters") {
$recup_donnees[attribute.$c] = $resultat[$c] -> attribute;
$recup_donnees[value.$c] = $resultat[$c] -> value;
//idem si la valeur courante est dparameters
} else if ($valeur_courante2 == "dparameters") {
$recup_donnees[attribute.$c+1] = $resultat[$c] -> attribute;
$recup_donnees[value.$c+1] = $resultat[$c] -> value;
//Si la valeur courante est parts on recommence à tester toutes les valeurs contenues après parts pour savoir si les clefs contiennent des objets ou de simples valeurs
} else if ($valeur_courante2 == "parts") {
for ($f=0;$f<17;$f++) {
//On vérifie que l'objet courant appelé existe
if (isset ($resultat[$c] -> $valeurs_objet[$f])) {
//Si l'objet courant appelé est un tableau on stocke le chemin dans $stock_tableau, sinon on inscrit la valeur dans $recup_donnees
if (is_array ($resultat[$c] -> $valeurs_objet[$f])) {
array_push ($stock_tableau, array ($c, $valeurs_objet[$f]));
} else {
$recup_donnees[$valeurs_objet[$f].$c] = $resultat[$c] -> $valeurs_objet[$f];
}
}
}
}
}
}
}
}
echo "<br><br><br>";
echo "recup_donnees : ";
print_r ($recup_donnees);
}
?>
Conclusion
J'espère que cette fonction pourra aider ceux qui veulent utiliser la fonction imap_fetchstructure qui peut renvoyer un tableau d'objet très vite énorme selon le mail analisé (un forward de forward avec pièces jointes, fichiers incorporés, etc...)
Sources du même auteur
Sources de la même categorie
RÉCUPÉRER LES MINIATURES D'UNE VIDÉO YOUTUBERÉCUPÉRER LES MINIATURES D'UNE VIDÉO YOUTUBE Le code est simple, il permet depuis une url youtube de récupérer son identifiant et de se connecter au serveur de miniatures pour en récupérer les im...
par tefa24600
CONVERTISSEUR DE NOMBRES EN TEXTECONVERTISSEUR DE NOMBRES EN TEXTEQu'est-ce ? Un convertisseur de nombre en texte.
Ses particularités?
- pas de limitation sur la taille du nombre (traitement en string, et non en ...
par macruz
CODAGE TEXTE >HTML, ISO, SPECIALCHARS, URL ET DECODAGECODAGE TEXTE >HTML, ISO, SPECIALCHARS, URL ET DECODAGECe script php permet, comme son nom l'indique de coder un texte pour remplacer les caractères spéciaux, ou apprendre à comprendre les htmlentities, sp...
par Salva9473
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
transformer un tableau en objet [ par franco_se ]
HelloJe souhaiterai transformer un tableau multidimensionnel en objet.Existe-t-il une fonction ( a la maniere de mysql_fetch_object ) ?Ou faut-il en
transformer un tableau multidimensionnel javascript en tableau multidimensionnel php [ par sagat06 ]
Bonjour à tous.Je tiens à préciser que mon niveau en php est assez limité, mes excuses, je tenterai d'y remédier.Voilà mon soucis: actuellement sur un
Extraire une donnée d'un objet stocké dans un tableau : comment faire ? [ par slhuilli ]
Bonjour à tous, Je fais du dev depuis 10 en procedural et là je suis en train d'appréhender l'objet avec bcp de mal. Voici ce que j'ai fait et qui fo
lien dynamique [ par kedieng ]
Salut à tous! Je fais une petite messagerie. Lorsqu'on clique sur Boite de reception on voit la liste de ses messages dans un tableau à trois colonnes
Comment accéder facilement à un élément d'un tableau d'objets? [ par takinelinfo ]
Bonjour,J'ai une toute petite question.Imaginons un tableau d'objet. Mon objet possede entre autre un attribut "id", "libelle" etc...Je fais donc un t
pb avec la poo5 [ par windu ]
Voila mon problème:Je crée un objet qui manipule (entre autres) des tableaux.... jusque là tout va bien!La où je coince, c'est que cet objet est appel
transformer un tableau multidimensionnel en chaine de caracteres [ par franco_se ]
bonjour a tous.voila, je cherche a enregistrer un tableau multidimensionnel dans un champ de ma table sql .le probleme est que, lorsque je fais "inser
Tableau d'objet [ par Galmiza ]
Salut,Est-il possible de créer un tableau d'objets ?$tab_membres = array(new Membre("nom1", "prénom1"),new Membre("nom2", "prénom2"),..
problème sur free [ par nemetos ]
Bonjour,j'ai développé un site en local avec easy php 1.8. Il fonctionne très bien. Seulement lorsque je l'ai uploadé sur free il y a un bug. Voici co
Récupérer tableau distant [ par alex2100 ]
Bonjour à tous,Je suis perdu. Je recherche la solution miracle. Voici mon problème, dans ma page web j'ai un tableau.Je voudrais que le contenu de ce
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|