php implode (101) con comillas

115

Implicando una matriz simple

se vería así

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

y eso devolvería esto

 lastname,email,phone

genial, así que podría hacer esto en su lugar

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

y ahora tengo lo que quiero, una bonita cadena csv

 'lastname','email','phone'

¿Hay una mejor manera de hacer esto? Me parece que debería haber un parámetro opcional para la implosión. ¿Me estoy perdiendo algo?

mcgrailm
fuente
11
Veo muchos comentarios acerca de que las respuestas proporcionadas son "más lentas". No importa . Elija la forma que sea más clara y fácil de mantener, preocúpese por el rendimiento más adelante, si es que lo hace.
meagar
1
El único inconveniente es que producirá una cadena vacía si la matriz está vacía. es decir. equivalente a$comma_separated = "''";
scipilot
1
Gran solución mcgrailm ... realmente lo aprecio
Sandeep Garg
1
gracias @mcgrailm, está funcionando para mis proyectos. Realmente aprecio esto.
Wafie Ali

Respuestas:

29

No, la forma en que lo estás haciendo está bien. implode()solo toma 1-2 parámetros (si solo proporciona una matriz, une las piezas mediante una cadena vacía).

Rafe Kettler
fuente
Parece que no hay diferencia de velocidad en ninguna de estas soluciones
Seguiré
163
$array = array('lastname', 'email', 'phone');


echo "'" . implode("','", $array) . "'";
Umesh Moghariya
fuente
simple tan rápido como se pone
Jeffz
esto hace el trabajo por mí
Mikey
5
Tenga cuidado con la matriz vacía mientras usa esta solución.
Luigi
Gracias. <ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
Usé
42

Podrías usar array_map():

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

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

MANIFESTACIÓN

También tenga en cuenta que existe fputcsvsi desea escribir en un archivo.

Felix Kling
fuente
@Felix Kling ¿Sospecho que esto también sería más lento?
mcgrailm
1
@mcgrailm, vuelvo a preguntar: ¿más lento que qué?
Naftali alias Neal
2
@mcgrailm: Tal vez, te sugiero que hagas un punto de referencia y lo averigües;)
Felix Kling
@Felix Kling ¿cómo hago eso?
mcgrailm
1
Esto tiene el beneficio adicional de permitirle escapar de las comillas simples que puedan aparecer en los elementos de la matriz
meagar
29
$ids = sprintf("'%s'", implode("','", $ids ) );
Robb
fuente
Impresionante, simple y directo.
Vinícius
23

No sé si es más rápido, pero podría guardar una línea de código con su método:

De

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

A:

$array = array('lastname', 'email', 'phone');
$comma_separated = "'".implode("','", $array)."'";
Drew Dello Stritto
fuente
y podría ampliar eso, pero poniendo la definición de matriz donde la variable $ matriz está en la última línea, pero la diferencia de velocidad sería tan finita
mcgrailm
8

Si desea utilizar bucles también puede hacer:

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

Demostración: http://codepad.org/O2kB4fRo

Naftali alias Neal
fuente
1
@mcgrailm, ¿más lento que qué? Es básicamente lo mismo que un array_mappero sin usararray_map
Naftali alias Neal
más lento que la forma en que actualmente creo mi cadena csv
mcgrailm
@mcgrailm ver el comentario de @ FelixKling
Naftali aka Neal
1
+1 parece la única respuesta correcta: todas las demás respuestas producirán una cadena vacía al intentar implosionar una matriz vacía. Este no lo hará.
Denis Matafonov
Gracias @DenisMatafonov :-)
Naftali aka Neal
2

Alternativamente, puede crear una función de este tipo:

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

fuente
1

Si desea evitar los subsistemas fopen / fputcsv, aquí hay un fragmento que crea una cadena CSV de escape a partir de una matriz asociativa ...

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

O de una lista de objetos ...

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

Luego, puede generar la cadena como desee.

doublejosh
fuente
0

también puedes hacerlo de esta manera

<?php
$csv= '\'' . join(array('lastname', 'email', 'phone'),'\',').'\'';
echo $csv;
?>
Senad Meškin
fuente
2
unirse es solo un alias de implosión
mcgrailm
0

Creo que esto es lo que intentas hacer

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

Otra opción posible, dependiendo de para qué necesite la matriz:

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

Esto pondrá '[' y ']' alrededor de la cadena, lo cual puede que desee o no.

Jeremy francés
fuente