php imploser (101) avec des guillemets

115

Imploser un tableau simple

ressemblerait à ça

$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

et cela retournerait ceci

 lastname,email,phone

super, alors je pourrais le faire à la place

$array = array('lastname', 'email', 'phone');
$comma_separated = implode("','", $array);
$comma_separated = "'".$comma_separated."'";

et maintenant j'ai ce que je veux une jolie chaîne csv

 'lastname','email','phone'

y a-t-il une meilleure façon de faire cela, j'ai l'impression qu'il devrait y avoir un paramètre facultatif pour imploser est-ce que je manque quelque chose?

mcgrailm
la source
11
Je vois beaucoup de commentaires sur les réponses fournies étant "plus lentes". Cela n'a pas d'importance . Choisissez la voie la plus claire et la plus maintenable, souciez-vous des performances plus tard, voire pas du tout.
meagar
1
Le seul inconvénient est qu'il produira une chaîne vide si le tableau est vide. c'est à dire. équivalent à$comma_separated = "''";
scipilot
1
Great solution mcgrailm ... vraiment l'apprécier
Sandeep Garg
1
merci @mcgrailm, ça marche pour mes projets. vraiment apprécier cela.
Wafie Ali

Réponses:

29

Non, la façon dont vous le faites est très bien. implode()prend seulement 1-2 paramètres (si vous fournissez juste un tableau, il joint les morceaux par une chaîne vide).

Rafe Kettler
la source
il semble qu'il n'y ait aucune différence de vitesse dans aucune de ces solutions, je vais continuer à le faire comme je l'ai toujours fait, merci pour l'aide de tout le monde
mcgrailm
163
$array = array('lastname', 'email', 'phone');


echo "'" . implode("','", $array) . "'";
Umesh Moghariya
la source
simple aussi vite que possible
Jeffz
cela fait le travail pour moi
mikey
5
Faites attention aux tableaux vides lors de l'utilisation de cette solution.
Luigi
Merci. J'ai utilisé ceci pour<ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
marlo
42

Vous pouvez utiliser array_map():

function add_quotes($str) {
    return sprintf("'%s'", $str);
}

$csv =  implode(',', array_map('add_quotes', $array));

DEMO

Notez également qu'il existe fputcsvsi vous souhaitez écrire dans un fichier.

Félix Kling
la source
@Felix Kling Je soupçonne que ce serait aussi plus lent?
mcgrailm
1
@mcgrailm, je demande à nouveau: plus lent que quoi?
Naftali aka Neal
2
@mcgrailm: Peut-être, je vous suggère de faire une référence et de le découvrir;)
Felix Kling
@Felix Kling comment puis-je faire ça?
mcgrailm
1
Cela a l'avantage supplémentaire de vous permettre d'échapper à tous les guillemets simples qui peuvent apparaître dans les éléments du tableau
meagar
29
$ids = sprintf("'%s'", implode("','", $ids ) );
Robb
la source
Génial, simple et direct.
Vinícius
23

Je ne sais pas si c'est plus rapide, mais vous pouvez enregistrer une ligne de code avec votre méthode:

De

$array = array('lastname', 'email', 'phone');
$comma_separated = implode("','", $array);
$comma_separated = "'".$comma_separated."'";

À:

$array = array('lastname', 'email', 'phone');
$comma_separated = "'".implode("','", $array)."'";
Drew Dello Stritto
la source
et je pourrais plus loin, mais en mettant la définition de tableau dans où la variable $ array est dans la dernière ligne mais je la vitesse diff serait tellement finie
mcgrailm
8

Si vous souhaitez utiliser des boucles, vous pouvez également faire:

$array = array('lastname', 'email', 'phone');
foreach($array as &$value){
   $value = "'$value'";
}
$comma_separated = implode(",", $array);

Démo: http://codepad.org/O2kB4fRo

Naftali alias Neal
la source
1
@mcgrailm, plus lent que quoi? C'est fondamentalement la même chose qu'un array_mapmais sans utiliserarray_map
Naftali aka Neal
plus lent que la façon dont je crée actuellement ma chaîne csv
mcgrailm
@mcgrailm voir le commentaire de @ FelixKling
Naftali aka Neal
1
+1 semble être la seule réponse correcte - toutes les autres réponses produiront une chaîne vide en essayant d'imploser un tableau vide. Celui-ci ne le fera pas.
Denis Matafonov
Merci @DenisMatafonov :-)
Naftali aka Neal
2

Vous pouvez également créer une telle fonction:

function implode_with_quotes(array $data)
{
    return sprintf("'%s'", implode("', '", $data));
}

la source
1

Si vous voulez éviter les sous-systèmes fopen / fputcsv, voici un extrait de code qui construit une chaîne CSV échappée à partir d'un tableau associatif ...

$output = '';
foreach ($list as $row) {
  $output .= '"' . implode('", "', array_values($row)) . '"' . "\r\n";
}

Ou à partir d'une liste d'objets ...

foreach ($list as $obj) {
  $output .= '"' . implode('", "', array_values((array) $obj)) . '"' . "\r\n";
}

Ensuite, vous pouvez afficher la chaîne comme vous le souhaitez.

doublejosh
la source
0

vous pouvez le faire de cette façon aussi

<?php
$csv= '\'' . join(array('lastname', 'email', 'phone'),'\',').'\'';
echo $csv;
?>
Senad Meškin
la source
2
join est juste un alias d'imploser
mcgrailm
0

Je pense que c'est ce que tu essaies de faire

$array = array('lastname', 'email', 'phone');
echo "'" . implode("','", explode(',', $array)) . "'";
rack_nilesh
la source
0

Une autre option possible, selon ce pour quoi vous avez besoin de la baie:

$array = array('lastname', 'email', 'phone');
echo json_encode($array);

Cela mettra '[' et ']' autour de la chaîne, ce que vous voudrez peut-être ou non.

Jeremy français
la source