php implode (101) com aspas


115

Implodindo uma matriz simples

ficaria assim

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

e isso retornaria isso

 lastname,email,phone

ótimo, então eu posso fazer isso ao invés

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

e agora eu tenho o que quero, uma bela e bonita corda csv

 'lastname','email','phone'

existe uma maneira melhor de fazer isso, parece-me que deveria haver um parâmetro opcional para implodir estou faltando alguma coisa?


11
Vejo muitos comentários sobre as respostas fornecidas serem "mais lentas". Não importa . Escolha o caminho mais claro e de fácil manutenção, preocupe-se com o desempenho depois, se for o caso.
meagar

1
A única desvantagem é que ele produzirá uma string vazia se o array estiver vazio. ie. equivalente a$comma_separated = "''";
scipilot

1
Ótima solução mcgrailm ... realmente agradeço
Sandeep Garg

1
obrigado @mcgrailm, está funcionando para meus projetos. realmente aprecio isso.
Wafie Ali

Respostas:


29

Não, o jeito que você está fazendo está ótimo. implode()leva apenas 1-2 parâmetros (se você apenas fornecer um array, ele une as peças por uma string vazia).


Parece que não há diferença de velocidade em nenhuma dessas soluções. Vou continuar fazendo do jeito que sempre fiz, obrigado pela ajuda de todos
mcgrailm

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


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

simples o mais rápido que
puder

isso faz o trabalho para mim
mikey

5
Cuidado com a matriz vazia ao usar esta solução.
Luigi

Obrigado. Eu usei isso por<ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
marlo

42

Você pode usar array_map():

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

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

DEMO

Observe também que existe fputcsvse você deseja gravar em um arquivo.


@Felix Kling Eu suspeito que isso seria mais lento também?
mcgrailm

1
@mcgrailm, pergunto de novo: mais lento do que o quê?
Naftali, também conhecido como Neal

2
@mcgrailm: Talvez, eu sugiro que você faça um benchmark e descubra;)
Felix Kling

@Felix Kling, como faço isso?
mcgrailm

1
Isso tem a vantagem de permitir que você escape de aspas simples que possam aparecer nos elementos da matriz
meagar

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

Incrível, simples e direto.
Vinícius

23

Não sei se é mais rápido, mas você pode salvar uma linha de código com seu método:

De

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

Para:

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

e eu poderia acrescentar isso, mas colocando a definição de array em que a variável $ array está na última linha, mas a diferença de velocidade seria tão finita
mcgrailm

8

Se você quiser usar loops, também pode fazer:

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

Demo: http://codepad.org/O2kB4fRo


1
@mcgrailm, mais lento do que o quê? É basicamente a mesma coisa que um, array_mapmas sem usararray_map
Naftali, também conhecido como Neal

mais lento do que a forma como crio atualmente minha string csv
mcgrailm

@mcgrailm veja o comentário de @FelixKling
Naftali também conhecido como Neal

1
+1 parece ser a única resposta correta - todas as outras respostas produzirão uma string vazia ao tentar implodir a matriz vazia. Este não vai.
Denis Matafonov

Obrigado @DenisMatafonov :-)
Naftali também conhecido como Neal

2

Alternativamente, você pode criar uma função:

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

1

Se você quiser evitar os subsistemas fopen / fputcsv, aqui está um trecho que constrói uma string CSV de escape a partir de uma matriz associativa ....

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

Ou de uma lista de objetos ...

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

Em seguida, você pode imprimir a string conforme desejado.


0

você pode fazer assim também

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

2
join é apenas um pseudônimo de implode
mcgrailm

0

Eu acho que é isso que você está tentando fazer

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

0

Outra opção possível, dependendo de para que você precisa da matriz:

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

Isso colocará '[' e ']' ao redor da string, o que você pode ou não querer.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.