Implode / Explode : Du tableau à la chaine de caractères, de la chaine de caractères au tableau

Comment concaténer les valeurs d'un tableau (array) en une seule ligne grâce à la fonction implode.

09 janvier 2011

Un problème assez courant en programmation est de vouloir concaténer toutes les valeurs contenues dans un tableau en une chaine de caractères, séparées par un séparateur comme une virgule.

Par exemple j'ai un fichier avec une liste de personnes pour qui je dois récupérer des informations dans une base de données. On a besoin de construire une requête du type :

CODE

SELECT
    u.age
FROM
    utilisateurs u
WHERE
    u.nom IN ('Bill', 'Steve', 'John', 'Mark')

Beaucoup partiraient sur une solution qui consiste à concaténer, à chaque tour de boucle, la nouvelle ligne à une chaine de caractères (que j'appellerai maintenant string car c'est plus court à écrire ).

Un truc dans ce style :

CODE

$chaine = "'";
//Ouverture du fichier en mode lecture
$ressource = fopen($nom_fichier, 'r');

while (!feof($ressource))
{
    // Tant que le fichier n'est pas au bout, on concatène les lignes.
    $chaine .= fgets($ressource) . "', '";
}
fclose($ressource); // Fermeture du fichier
$chaine .= "'";

Résultat : 'Bill', 'Steve', 'John', 'Mark', '

Déjà ça ne marche pas car il y a une virgule en trop à la fin ! Il faudrait retraiter la string pour l'enlever, ce n'est pas trop grave pour cet exemple mais le séparateur peut être totalement autre chose qu'une virgule ce qui peut rendre la chose difficile dans certains cas.

Une autre solution que je préfère consiste à mettre les noms dans un tableau et à utiliser la fonction implode de PHP .

CODE

$tab = array();
$ressource = fopen($nom_fichier, 'r'); //Ouverture du fichier en mode lecture
while (!feof($ressource))
{
    // Tant que le fichier n'est pas au bout, on stocke les lignes dans un tableau. 
    $tab[] = fgets($ressource);
}
fclose($ressource); // Fermeture du fichier
$chaine .= "'" . implode("', '", $tab) . "'"; // Implosion du tableau et concaténation

/**********************************************************
** AUTRE SOLUTION POUR DE PETITS FICHIERS < 10MO
**********************************************************/

$tab = array();
$tab = file($nom_fichier); // Lecture du fichier et explosion par ligne
$chaine .= "'" . implode("', '", $tab) . "'"; // Implosion du tableau et concaténation

Résultat : 'Bill', 'Steve', 'John', 'Mark'

Voilà qui est mieux !

La fonction inverse de implode s'appelle explode. Elle permet d'exploser une string sur un séparateur et retourne un tableau.

Par exemple : explode(" <hr/> ", "Ligne 1 <hr/> Ligne 2") retourne array("Ligne 1", "Ligne 2").

Par
Créateur et administrateur.

Dans la même catégorie

Formater un tableau pour CURLOPT_POSTFIELDS
Email avec pièce jointe en PHP
PHP : modifier les attributs privés d'un objet
Tester l'existence d'un fichier dans l'include path
Convertir récursivement un objet PHP en tableau
PHP : formater un tableau en CSV
Comment envoyer un mail en ligne de commande ?
RSYNC : Comment synchroniser des fichiers à travers une connexion ssh ?
Exécuter un code PHP en ligne de commande
Doctrine 2 : générer les classes PHP depuis la base de données
Comment catcher les erreurs en PHP ?
Doctrine 2 : comment afficher la requête SQL ?
Comment construire une URL sans caractères spéciaux en PHP ?
Comment lister les fichiers PHP inclus sur ma page ?
Les fonctions anonymes récursives en PHP
Requête HTTP asynchrone en PHP
La résolution statique à la volée ou Late Static Bindings
Trouver les jours fériés français en PHP
Comment allumer son ordinateur à distance en PHP ?
Comment utiliser la balise meta viewport ?
Une version mobile de mon site avec le Zend Framework
Doctrine et le Zend Framework : Présentation, intégration et utilisation
Créer son flux RSS simplement avec Zend_Feed
Appliquer un layout sur un mail avec le Zend Framework
Comment lancer une requête multi-bases avec les fonctions MySQL ?

Commentaire(s)