php implode (101) tra virgolette


115

Implodere un semplice array

sarebbe simile a questo

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

e questo restituirebbe questo

 lastname,email,phone

fantastico, quindi potrei farlo invece

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

e ora ho quello che voglio una bella stringa CSV carina

 'lastname','email','phone'

c'è un modo migliore per farlo, mi sembra che dovrebbe esserci un parametro opzionale per implodere, mi manca qualcosa?


11
Vedo molti commenti sulle risposte fornite "più lente". Non importa . Scegli il modo che è più chiaro e più gestibile, preoccupati delle prestazioni in seguito, se non del tutto.
meagar

1
L'unico inconveniente è che produrrà una stringa vuota se l'array è vuoto. vale a dire. equivalente a$comma_separated = "''";
scipilot

1
Ottima soluzione mcgrailm ... lo apprezzo davvero
Sandeep Garg

1
grazie @mcgrailm, funziona per i miei progetti. lo apprezzo davvero.
Wafie Ali

Risposte:


29

No, il modo in cui lo fai va benissimo. implode()accetta solo 1-2 parametri (se fornisci solo un array, unisce i pezzi con una stringa vuota).


sembra che non ci sia differenza di velocità in nessuna di queste soluzioni, continuerò a farlo come ho sempre fatto, grazie per l'aiuto di tutti
mcgrailm

163
$array = array('lastname', 'email', 'phone');


echo "'" . implode("','", $array) . "'";

semplice il più velocemente possibile
Jeffz

questo fa il lavoro per me
Mikey,

5
Fai attenzione agli array vuoti mentre usi questa soluzione.
Luigi

Grazie. L'ho usato per<ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
marlo

42

Potresti usare array_map():

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

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

DEMO

Nota anche che c'è fputcsvse vuoi scrivere su un file.


@Felix Kling, sospetto che anche questo sarebbe più lento?
mcgrailm

1
@ mcgrailm, chiedo di nuovo: più lento di cosa?
Naftali aka Neal

2
@mcgrailm: Forse, ti suggerisco di fare un benchmark e scoprirlo;)
Felix Kling

@Felix Kling come posso farlo?
mcgrailm

1
Questo ha l'ulteriore vantaggio di permetterti di sfuggire alle virgolette singole che possono apparire negli elementi dell'array
meagar

29
$ids = sprintf("'%s'", implode("','", $ids ) );

Fantastico, semplice e diretto.
Vinícius

23

Non so se sia più veloce, ma potresti salvare una riga di codice con il tuo metodo:

A partire dal

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

Per:

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

e potrei ulteriormente ma inserendo la definizione di array in cui la variabile $ array è nell'ultima riga, ma io la differenza di velocità sarebbe così finita
mcgrailm

8

Se vuoi usare i loop puoi anche fare:

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

Demo: http://codepad.org/O2kB4fRo


1
@ mcgrailm, più lento di cosa? È fondamentalmente la stessa cosa di un array_mapma senza usarearray_map
Naftali aka Neal,

più lento del modo in cui creo attualmente la mia stringa csv
mcgrailm

@mcgrailm vedi il commento di @ FelixKling
Naftali aka Neal

1
+1 sembra l'unica risposta corretta: tutte le altre risposte produrranno una stringa vuota quando si tenta di implodere un array vuoto. Questo non lo farà.
Denis Matafonov

Grazie @DenisMatafonov :-)
Naftali aka Neal

2

In alternativa puoi creare una tale funzione:

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

1

Se vuoi evitare i sottosistemi fopen / fputcsv, ecco uno snippet che crea una stringa CSV con escape da un array associativo ...

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

O da un elenco di oggetti ...

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

Quindi puoi emettere la stringa come desideri.


0

puoi farlo anche in questo modo

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

2
join è solo un alias di implode
mcgrailm

0

Penso che questo sia quello che stai cercando di fare

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

0

Un'altra possibile opzione, a seconda di cosa ti serve l'array:

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

Questo metterà "[" e "]" attorno alla stringa, che potresti volere o meno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.