php implode (101) tırnaklarla


115

Basit bir diziyi parçalamak

böyle görünürdü

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

ve bu bunu geri döndürür

 lastname,email,phone

harika, onun yerine bunu yapabilirim

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

ve şimdi istediğim güzel, güzel bir csv dizesine sahibim

 'lastname','email','phone'

bunu yapmanın daha iyi bir yolu var mı, implode için isteğe bağlı bir parametre olması gerektiği gibi geliyor bana bir şey mi kaçırıyorum?


11
Verilen yanıtların "daha yavaş" olduğuna dair birçok yorum görüyorum. Önemli değil . Daha net ve bakımı daha kolay olan yolu seçin, eğer varsa daha sonra performans için endişelenin.
meagar

1
Tek dezavantajı, dizi boşsa bir boş dizge üretmesidir. yani. eşdeğer$comma_separated = "''";
scipilot

1
Harika çözüm mcgrailm ... gerçekten takdir ediyorum
Sandeep Garg

1
teşekkürler @mcgrailm, projelerim için çalışıyor. bunu gerçekten takdir ediyorum.
Wafie Ali

Yanıtlar:


29

Hayır, bunu yapma şeklin gayet iyi. implode()yalnızca 1-2 parametre alır (eğer bir dizi sağlarsanız, parçaları boş bir dizeyle birleştirir).


Görünüşe göre bu çözümlerin hiçbirinde hız farkı yok, her zaman yaptığım gibi yapmaya devam edeceğim, herkese yardım için teşekkürler
mcgrailm

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


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

olabildiğince hızlı
Jeffz

bu benim için iş yapıyor
mikey

5
Bu çözümü kullanırken boş diziye dikkat edin.
Luigi

Teşekkürler. Bunu için kullandım<ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
marlo

42

Şunları kullanabilirsiniz array_map():

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

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

DEMO

Ayrıca fputcsvbir dosyaya yazmak istiyorsanız var olduğunu unutmayın .


@Felix Kling Bunun da daha yavaş olacağından şüpheleniyorum?
mcgrailm

1
@mcgrailm, tekrar soruyorum: Neyden daha yavaş?
Naftali namı diğer Neal

2
@mcgrailm: Belki, bir kıyaslama yapıp öğrenmenizi öneririm;)
Felix Kling

@Felix Kling bunu nasıl yaparım?
mcgrailm

1
Bu, dizi öğelerinde görünebilecek herhangi bir tek
tırnaktan kaçmanıza


23

Daha hızlı olup olmadığını bilmiyorum, ancak yönteminizle bir kod satırı kaydedebilirsiniz:

itibaren

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

Kime:

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

ve bunu daha da ileri götürebilirim ama dizi tanımını $ dizi değişkeninin son satırda olduğu
yere koyarsam

8

Döngüler kullanmak istiyorsanız şunları da yapabilirsiniz:

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

Demo: http://codepad.org/O2kB4fRo


1
@mcgrailm, neden daha yavaş? Temelde bir ile aynı şey array_mapama kullanmadanarray_map
Naftali aka Neal

şu anda csv
dizimi

@mcgrailm bkz @ FelixKling'in yorumu
Naftali aka Neal

1
+1 tek doğru cevap gibi görünüyor - diğer tüm cevaplar boş diziyi patlatmaya çalışırken boş dizge üretecek. Bu bir alışkanlık.
Denis Matafonov

Teşekkürler @DenisMatafonov :-)
Naftali aka Neal

2

Alternatif olarak, böyle bir işlev oluşturabilirsiniz:

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

1

Fopen / fputcsv alt sistemlerinden kaçınmak istiyorsanız, işte bir ilişkilendirilebilir diziden çıkış karakterli bir CSV dizesi oluşturan bir kod parçacığı ...

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

Veya bir nesne listesinden ...

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

Ardından dizeyi istediğiniz gibi çıkarabilirsiniz.


0

bu şekilde de yapabilirsin

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

2
join sadece
implode'un

0

Sanırım yapmaya çalıştığın şey bu

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

0

Diziye ne için ihtiyacınız olduğuna bağlı olarak başka bir olası seçenek:

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

Bu, isteyebileceğiniz veya istemeyebileceğiniz dizenin etrafına '[' ve ']' koyacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.