Come creo un elenco separato da virgole da un array in PHP?


113

So come scorrere gli elementi di un array usando foreach e aggiungere una virgola, ma è sempre un problema dover rimuovere la virgola finale. C'è un modo semplice PHP per farlo?

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

Alla fine voglio

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

Risposte:


231

Vuoi usare implode per questo.

vale a dire: $commaList = implode(', ', $fruit);


C'è un modo per aggiungere virgole senza averne una finale. Ti piacerebbe farlo se devi fare qualche altra manipolazione allo stesso tempo. Ad esempio, forse vuoi citare ogni frutto e poi separarli tutti con virgole:

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

Inoltre, se lo fai nel modo "normale" di aggiungere una virgola dopo ogni elemento (come sembra che stavi facendo prima), e devi tagliare l'ultimo, fallo $list = rtrim($list, ', '). Vedo un sacco di persone che si muovono inutilmente substrin questa situazione.


4
Avrebbe più senso (se si cerca di aggiungere virgolette) chiamare <code> $ fruitlist = '"'. Implode ('", "', $ fruit). '"'; </code>
cwallenpoole

Il ciclo foreach è migliore se vuoi manipolare quei dati nell'array prima di trasformarli in una stringa; Ad esempio, addedlashes o mysql_real_escape_string.
Naphtali Galaad,

39

Ecco come l'ho fatto:

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

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

echo $string;

Produzione:

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

Demo dal vivo: http://ideone.com/EWK1XR

EDIT: Per il commento di @ joseantgv, dovresti essere in grado di rimuovere rtrim()dall'esempio sopra. Vale a dire:

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

5
Come risposto sopra, potresti semplicemente implodere (',', $ arr)
joseantgv

@joseantgv Hai ragione, non so perché lo uso rtrim(). Ricordo di aver avuto un problema con la presenza di virgole extra alla fine della stringa, ma non ricordo la situazione in cui stava accadendo.
Nate

6

Risultato con andalla fine:

$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

Simile alla risposta di Lloyd, ma funziona con array di qualsiasi dimensione.

$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

Preferisco usare un'istruzione IF nel ciclo FOR che controlla per assicurarsi che l'iterazione corrente non sia l'ultimo valore nell'array. In caso contrario, aggiungi una virgola

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

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

2
se il conteggio totale è solo diverso da 4?
Jyothish

1

A volte non hai nemmeno bisogno di php per questo in alcuni casi (gli elementi dell'elenco sono ciascuno nel proprio tag generico durante il rendering per esempio) Puoi sempre aggiungere virgole a tutti gli elementi tranne last-child tramite css se sono elementi separati dopo essere stati renderizzati dal copione.

Lo uso molto nelle app backbone in realtà per tagliare un po 'di grasso di codice arbitrario:

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

Fondamentalmente guarda l'elemento, prende di mira tutti tranne l'ultimo elemento e dopo ogni elemento aggiunge una virgola. Solo un modo alternativo per non dover usare affatto lo script se il caso si applica.


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

0

Una soluzione funzionale sarebbe questa:

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

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

0

Segui questo

$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

Se fai le risposte citate, puoi farlo

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

quanto sopra presuppone che il frutto non sia nullo. Se non vuoi fare questo presupposto puoi usare un'istruzione if-then-else o un operatore ternario (? :).


-2

Un altro modo potrebbe essere così:

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

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

L'output di $resultè un elenco separato da virgole ben formattato.

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

output-> a, b, c, d, e, f, g

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.