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?


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


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

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


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

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


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

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.


0

Sie können es auch so machen

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

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.