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?


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).


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) . "'";

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.


@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


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)."'";

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


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));
}

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.


0

vous pouvez le faire de cette façon aussi

<?php
$csv= '\'' . join(array('lastname', 'email', 'phone'),'\',').'\'';
echo $csv;
?>

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)) . "'";

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.