PHP implodieren (101) mit Anführungszeichen

115

Implodieren eines einfachen Arrays

würde so aussehen

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

und das würde dies zurückgeben

 lastname,email,phone

großartig, also könnte ich das stattdessen tun

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

und jetzt habe ich was ich will eine schöne hübsche csv string

 'lastname','email','phone'

Gibt es einen besseren Weg, dies zu tun? Ich denke, es sollte einen optionalen Parameter für implodieren geben. Fehlt mir etwas?

mcgrailm
quelle
11
Ich sehe viele Kommentare zu den Antworten, die "langsamer" sind. Es spielt keine Rolle . Wählen Sie den Weg, der klarer und wartbarer ist, und sorgen Sie sich später, wenn überhaupt, um die Leistung.
Meagar
1
Der einzige Nachteil ist, dass eine leere Zeichenfolge erzeugt wird, wenn das Array leer ist. dh. äquivalent zu$comma_separated = "''";
scipilot
1
Tolle Lösung mcgrailm ... wirklich zu schätzen
Sandeep Garg
1
danke @mcgrailm, es funktioniert für meine Projekte. schätze das wirklich.
Wafie Ali

Antworten:

29

Nein, die Art und Weise, wie Sie es tun, ist in Ordnung. implode()Es werden nur 1-2 Parameter verwendet (wenn Sie nur ein Array angeben, werden die Teile durch eine leere Zeichenfolge verbunden).

Rafe Kettler
quelle
Es scheint, dass es bei keiner dieser Lösungen einen Geschwindigkeitsunterschied gibt. Ich mache es einfach so weiter, wie ich es immer getan habe.
Vielen
162
$array = array('lastname', 'email', 'phone');


echo "'" . implode("','", $array) . "'";
Umesh Moghariya
quelle
einfach so schnell wie es nur geht
Jeffz
Das macht den Job für mich
Mikey
5
Achten Sie bei Verwendung dieser Lösung auf ein leeres Array.
Luigi
Vielen Dank. Ich habe dies für<ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
Marlo
42

Sie könnten verwenden array_map():

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

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

DEMO

Beachten fputcsvSie auch, dass dies der Fall ist, wenn Sie in eine Datei schreiben möchten.

Felix Kling
quelle
@ Felix Kling Ich vermute, das wäre auch langsamer?
Mcgrailm
1
@mcgrailm, ich frage nochmal: langsamer als was?
Naftali aka Neal
2
@mcgrailm: Vielleicht schlage ich vor, Sie machen einen Benchmark und finden es heraus;)
Felix Kling
@ Felix Kling wie mache ich das?
Mcgrailm
1
Dies hat den zusätzlichen Vorteil, dass Sie alle einfachen Anführungszeichen
vermeiden
29
$ids = sprintf("'%s'", implode("','", $ids ) );
Robb
quelle
Genial, einfach und direkt.
Vinícius
23

Ich weiß nicht, ob es schneller geht, aber Sie können mit Ihrer Methode eine Codezeile speichern:

Von

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

Zu:

$array = array('lastname', 'email', 'phone');
$comma_separated = "'".implode("','", $array)."'";
Drew Dello Stritto
quelle
und ich könnte das weiter machen, aber die Definition des Arrays dort
einfügen,
8

Wenn Sie Schleifen verwenden möchten, können Sie auch Folgendes tun:

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

Demo: http://codepad.org/O2kB4fRo

Naftali alias Neal
quelle
1
@mcgrailm, langsamer als was? Es ist im Grunde das gleiche wie ein, array_mapaber ohne Verwendungarray_map
Naftali aka Neal
langsamer als die Art und Weise, wie ich derzeit meine CSV-Zeichenfolge erstelle
mcgrailm
@ Mcgrailm siehe @ FelixKlings Kommentar
Naftali aka Neal
1
+1 scheint die einzig richtige Antwort zu sein - alle anderen Antworten erzeugen eine leere Zeichenfolge, wenn versucht wird, ein leeres Array zu implodieren. Dieser wird nicht.
Denis Matafonov
Danke @DenisMatafonov :-)
Naftali aka Neal
2

Alternativ können Sie eine solche Funktion erstellen:

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

quelle
1

Wenn Sie die Subsysteme fopen / fputcsv vermeiden möchten, finden Sie hier ein Snippet, das eine maskierte CSV-Zeichenfolge aus einem assoziativen Array erstellt.

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

Oder aus einer Liste von Objekten ...

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

Dann können Sie die Zeichenfolge wie gewünscht ausgeben.

Doublejosh
quelle
0

Sie können es auch so machen

<?php
$csv= '\'' . join(array('lastname', 'email', 'phone'),'\',').'\'';
echo $csv;
?>
Senad Meškin
quelle
2
join ist nur ein Alias ​​von implode
mcgrailm
0

Ich denke, das ist es, was du versuchst zu tun

$array = array('lastname', 'email', 'phone');
echo "'" . implode("','", explode(',', $array)) . "'";
ack_nilesh
quelle
0

Eine weitere mögliche Option, je nachdem, wofür Sie das Array benötigen:

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

Dadurch werden '[' und ']' um die Zeichenfolge gesetzt, die Sie möglicherweise möchten oder nicht.

Jeremy French
quelle