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.