PHP'de bir diziden virgülle ayrılmış bir listeyi nasıl oluştururum?


113

Foreach kullanarak bir dizinin öğeleri arasında nasıl döngü yapılacağını ve virgül ekleneceğini biliyorum, ancak son virgülden kurtulmak her zaman bir acıdır. Bunu yapmanın kolay bir PHP yolu var mı?

$fruit = array('apple', 'banana', 'pear', 'grape');

Eninde sonunda istiyorum

$result = "apple, banana, pear, grape"

Yanıtlar:


231

Bunun için implode kullanmak istiyorsunuz .

yani: $commaList = implode(', ', $fruit);


Sonunda virgül olmadan virgül eklemenin bir yolu var. Aynı anda başka bir manipülasyon yapmak zorunda kalırsanız, bunu yapmak istersiniz. Örneğin, her bir meyveden alıntı yapmak ve ardından hepsini virgülle ayırmak isteyebilirsiniz:

$prefix = $fruitList = '';
foreach ($fruits as $fruit)
{
    $fruitList .= $prefix . '"' . $fruit . '"';
    $prefix = ', ';
}

Ayrıca, her öğeden sonra virgül eklemenin "normal" yolunu kullanırsanız (daha önce yaptığınız gibi) ve sonuncuyu kırpmanız gerekir, sadece yapın $list = rtrim($list, ', '). substrBu durumda gereksiz yere uğraşan birçok insan görüyorum .


4
<code> $ fruitlist = '"'. İmplode ('", "', $ fruit) 'i çağırmak (tırnak eklemeye çalışıyorsanız) daha mantıklı olacaktır.'" '; </code>
cwallenpoole

Bir diziye dönüştürmeden önce dizideki verileri değiştirmek istiyorsanız foreach döngüsü daha iyidir; Örneğin, eğik çizgiler veya mysql_real_escape_string ekleyin.
Naphtali Gilead

39

Ben böyle yapıyorum:

$arr = array(1,2,3,4,5,6,7,8,9);

$string = rtrim(implode(',', $arr), ',');

echo $string;

Çıktı:

1,2,3,4,5,6,7,8,9

Canlı Demo: http://ideone.com/EWK1XR

DÜZENLEME: @ joseantgv'nin yorumuna göre, rtrim()yukarıdaki örnekten kaldırmanız gerekir . yani:

$string = implode(',', $arr);

5
Yukarıda yanıtlandığı gibi, implode (',', $ arr) yapabilirsiniz
joseantgv

@joseantgv Haklısın, neden kullandığımı bilmiyorum rtrim(). Dizenin sonunda fazladan virgül olmasıyla ilgili bir sorun yaşadığımı hatırlıyorum, ancak meydana geldiği durumu hatırlayamıyorum.
Nate

6

andSonunda ile sonuç :

$titleString = array('apple', 'banana', 'pear', 'grape');
$totalTitles = count($titleString);
if ($totalTitles>1) {
    $titleString = implode(', ', array_slice($titleString, 0, $totalTitles-1)) . ' and ' . end($titleString);
} else {
    $titleString = implode(', ', $titleString);
}

echo $titleString; // apple, banana, pear and grape

3

Lloyd'un cevabına benzer, ancak her boyuttaki diziyle çalışır.

$missing = array();
$missing[] = 'name';
$missing[] = 'zipcode';
$missing[] = 'phone';

if( is_array($missing) && count($missing) > 0 )
        {
            $result = '';
            $total = count($missing) - 1;
            for($i = 0; $i <= $total; $i++)
            { 
              if($i == $total && $total > 0)
                   $result .= "and ";

              $result .= $missing[$i];

              if($i < $total)
                $result .= ", ";
            }

            echo 'You need to provide your '.$result.'.';
            // Echos "You need to provide your name, zipcode, and phone."
        }

3

FOR döngüsünde, geçerli yinelemenin dizideki son değer olmadığından emin olmak için kontrol eden bir IF ifadesi kullanmayı tercih ederim. Değilse, virgül ekleyin

$fruit = array("apple", "banana", "pear", "grape");

for($i = 0; $i < count($fruit); $i++){
    echo "$fruit[$i]";
    if($i < (count($fruit) -1)){
      echo ", ";
    }
}

2
toplam sayı 4'ten farklıysa?
Jyothish

1

Bazen bazı durumlarda bunun için php'ye bile ihtiyacınız olmaz (Örneğin, liste öğelerinin her biri kendi genel etiketindedir) Oluşturulduktan sonra ayrı öğelerse, css aracılığıyla son çocuk dışındaki tüm öğelere her zaman virgül ekleyebilirsiniz. senaryodan.

Bunu omurga uygulamalarında aslında keyfi kod yağlarını azaltmak için çok kullanıyorum:

.likers a:not(:last-child):after { content: ","; }

Temel olarak öğeye bakar, son öğesi hariç her şeyi hedefler ve her öğeden sonra bir virgül ekler. Durum geçerliyse komut dosyası kullanmak zorunda kalmamak için alternatif bir yol.


1
$fruit = array('apple', 'banana', 'pear', 'grape');    
$commasaprated = implode(',' , $fruit);

0

İşlevsel bir çözüm şu şekildedir:

$fruit = array('apple', 'banana', 'pear', 'grape');
$sep = ','; 

array_reduce(
    $fruits,
    function($fruitsStr, $fruit) use ($sep) {
        return (('' == $fruitsStr) ? $fruit : $fruitsStr . $sep . $fruit);
    },
    ''
);

0

Bunu takip et

$teacher_id = '';

        for ($i = 0; $i < count($data['teacher_id']); $i++) {

            $teacher_id .= $data['teacher_id'][$i].',';

        }
        $teacher_id = rtrim($teacher_id, ',');
        echo $teacher_id; exit;

-1

Alıntılanan cevaplar yapıyorsanız, yapabilirsiniz

$commaList = '"'.implode( '" , " ', $fruit). '"';

yukarıdakiler meyvenin boş olmadığını varsayar. Bu varsayımı yapmak istemiyorsanız, if-then-else ifadesini veya üçlü (? :) operatörünü kullanabilirsiniz.


-2

Başka bir yol da şöyle olabilir:

$letters = array("a", "b", "c", "d", "e", "f", "g");

$result = substr(implode(", ", $letters), 0, -3);

Çıktısı, $resultvirgülle ayrılmış güzel biçimlendirilmiş bir listedir.

a, b, c, d, e, f, g

-2
$letters = array("a", "b", "c", "d", "e", "f", "g"); // this array can n no. of values
$result = substr(implode(", ", $letters), 0);
echo $result

çıktı-> a, b, c, d, e, f, g

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.