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?


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


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

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


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

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


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

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.


0

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

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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.