php implode (101) z cudzysłowami

115

Implodowanie prostej tablicy

wyglądałoby tak

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

i to zwróci to

 lastname,email,phone

świetnie, więc zamiast tego mogę to zrobić

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

a teraz mam to, czego chcę, ładny, ładny ciąg CSV

 'lastname','email','phone'

czy jest lepszy sposób na zrobienie tego, wydaje mi się, że powinien istnieć opcjonalny parametr dla implodowania. Czy czegoś mi brakuje?

mcgrailm
źródło
11
Widzę wiele komentarzy, że udzielane odpowiedzi są „wolniejsze”. To nie ma znaczenia . Wybierz sposób, który jest jaśniejszy i łatwiejszy w utrzymaniu, martw się później o wydajność, jeśli w ogóle.
meagar
1
Jedyną wadą jest to, że jeśli tablica jest pusta, zwróci jeden pusty łańcuch. to znaczy. odpowiednik$comma_separated = "''";
scipilot
1
Świetne rozwiązanie mcgrailm ... naprawdę to doceniam
Sandeep Garg
1
dzięki @mcgrailm, to działa dla moich projektów. naprawdę to doceniam.
Wafie Ali,

Odpowiedzi:

29

Nie, sposób, w jaki to robisz, jest w porządku. implode()przyjmuje tylko 1-2 parametry (jeśli podasz po prostu tablicę, połączy elementy pustym ciągiem).

Rafe Kettler
źródło
Wygląda na to, że nie ma różnicy w szybkości w żadnym z tych rozwiązań Po prostu będę to robić tak, jak zawsze, dzięki za pomoc wszystkich
mcgrailm
163
$array = array('lastname', 'email', 'phone');


echo "'" . implode("','", $array) . "'";
Umesh Moghariya
źródło
tak proste, jak to tylko możliwe
Jeffz
to działa dla mnie
mikey
5
Uważaj na pustą tablicę korzystając z tego rozwiązania.
Luigi,
Dzięki. Użyłem tego do<ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
marlo
42

Możesz użyć array_map():

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

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

PRÓBNY

Zauważ również, że jest, fputcsvjeśli chcesz pisać do pliku.

Felix Kling
źródło
@Felix Kling Podejrzewam, że to również byłoby wolniejsze?
mcgrailm
1
@mcgrailm, pytam jeszcze raz: wolniej niż co?
Naftali alias Neal
2
@mcgrailm: Może, proponuję zrobić benchmark i dowiedzieć się;)
Felix Kling
@Felix Kling, jak mam to zrobić?
mcgrailm
1
Ma to tę dodatkową zaletę, że pozwala uniknąć pojedynczych cudzysłowów, które mogą pojawić się w elementach tablicy
meagar
29
$ids = sprintf("'%s'", implode("','", $ids ) );
Robb
źródło
Niesamowite, proste i bezpośrednie.
Vinícius,
23

Nie wiem, czy to szybsze, ale możesz zapisać linię kodu za pomocą swojej metody:

Z

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

Do:

$array = array('lastname', 'email', 'phone');
$comma_separated = "'".implode("','", $array)."'";
Drew Dello Stritto
źródło
i mógłbym dalej, ale umieszczając definicję tablicy w miejscu, w którym zmienna $ array znajduje się w ostatnim wierszu, ale różnica prędkości byłaby tak skończona
mcgrailm
8

Jeśli chcesz używać pętli, możesz również:

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

Demo: http://codepad.org/O2kB4fRo

Naftali alias Neal
źródło
1
@mcgrailm, wolniej niż co? Zasadniczo jest to to samo, co array_mapbez użyciaarray_map
Naftali aka Neal
wolniej niż sposób, w jaki obecnie tworzę ciąg csv
mcgrailm
@mcgrailm see @ FelixKling's comment
Naftali aka Neal
1
+1 wydaje się jedyną poprawną odpowiedzią - wszystkie inne odpowiedzi dadzą pusty ciąg podczas próby implodowania pustej tablicy. Ten nie będzie.
Denis Matafonov
Dzięki @DenisMatafonov :-)
Naftali aka Neal
2

Alternatywnie możesz utworzyć taką funkcję:

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

źródło
1

Jeśli chcesz uniknąć podsystemów fopen / fputcsv, oto fragment kodu, który tworzy ciąg znaków CSV ze zmianą znaczenia z tablicy asocjacyjnej ...

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

Lub z listy obiektów ...

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

Następnie możesz wyprowadzić ciąg zgodnie z potrzebami.

doublejosh
źródło
0

możesz to również zrobić w ten sposób

<?php
$csv= '\'' . join(array('lastname', 'email', 'phone'),'\',').'\'';
echo $csv;
?>
Senad Meškin
źródło
2
join to tylko alias implode
mcgrailm
0

Myślę, że właśnie to próbujesz zrobić

$array = array('lastname', 'email', 'phone');
echo "'" . implode("','", explode(',', $array)) . "'";
rack_nilesh
źródło
0

Inna możliwa opcja, w zależności od tego, do czego potrzebujesz tablicy:

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

Spowoduje to umieszczenie znaków „[” i „]” wokół łańcucha, czego możesz chcieć lub nie.

Jeremy French
źródło