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?


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


Parece que no hay diferencia de velocidad en ninguna de estas soluciones
Seguiré

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


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

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

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

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


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

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.


0

también puedes hacerlo de esta manera

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

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.