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?

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

Rafe Kettler
fonte
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) . "'";
Umesh Moghariya
fonte
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
fonte
@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 ) );
Robb
fonte
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)."'";
Drew Dello Stritto
fonte
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

Naftali também conhecido como Neal
fonte
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));
}

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

doublejosh
fonte
0

você pode fazer assim também

<?php
$csv= '\'' . join(array('lastname', 'email', 'phone'),'\',').'\'';
echo $csv;
?>
Senad Meškin
fonte
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)) . "'";
rack_nilesh
fonte
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.

Jeremy French
fonte