Comment créer une liste séparée par des virgules à partir d'un tableau en PHP?


113

Je sais comment parcourir les éléments d'un tableau en utilisant foreach et ajouter une virgule, mais c'est toujours pénible de retirer la virgule finale. Existe-t-il un moyen PHP simple de le faire?

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

Finalement je veux

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

Réponses:


231

Vous souhaitez utiliser implode pour cela.

c'est à dire: $commaList = implode(', ', $fruit);


Il existe un moyen d'ajouter des virgules sans en avoir une à la fin. Vous voudrez faire cela si vous devez faire une autre manipulation en même temps. Par exemple, vous voudrez peut-être citer chaque fruit puis les séparer tous par des virgules:

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

De plus, si vous le faites simplement de la manière "normale" d'ajouter une virgule après chaque élément (comme vous le faisiez auparavant), et que vous devez couper le dernier, faites-le $list = rtrim($list, ', '). Je vois beaucoup de gens se débrouiller inutilement substrdans cette situation.


4
Il serait plus logique (si vous essayez d'ajouter des guillemets) d'appeler <code> $ fruitlist = '"'. Implode ('", "', $ fruit). '"'; </code>
cwallenpoole

La boucle foreach est meilleure si vous souhaitez manipuler ces données dans le tableau avant d'en faire une chaîne; Par exemple, ajoute des barres obliques ou mysql_real_escape_string.
Naphtali Gilead

39

Voici comment je fais:

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

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

echo $string;

Production:

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

Démo en direct: http://ideone.com/EWK1XR

EDIT: Selon le commentaire de @ joseantgv, vous devriez pouvoir supprimer rtrim()de l'exemple ci-dessus. C'est à dire:

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

5
Comme répondu ci-dessus, vous pouvez simplement faire imploser (',', $ arr)
joseantgv

@joseantgv Vous avez raison, je ne sais pas pourquoi j'utilise rtrim(). Je me souviens avoir eu un problème avec des virgules supplémentaires à la fin de la chaîne, mais je ne me souviens pas de la situation où cela se produisait.
Nate le

6

Résultat avec andau final:

$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

Similaire à la réponse de Lloyd, mais fonctionne avec n'importe quel tableau de taille.

$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

Je préfère utiliser une instruction IF dans la boucle FOR qui vérifie que l'itération actuelle n'est pas la dernière valeur du tableau. Sinon, ajoutez une virgule

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

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

2
si le nombre total est juste différent de 4?
Jyothish

1

Parfois, vous n'avez même pas besoin de php pour cela dans certaines instances (les éléments de liste sont chacun dans leur propre balise générique lors du rendu par exemple) Vous pouvez toujours ajouter des virgules à tous les éléments, mais last-child via css s'ils sont des éléments séparés après avoir été rendus du script.

J'utilise beaucoup cela dans les applications de base pour réduire la graisse de code arbitraire:

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

En gros, regarde l'élément, cible tout sauf son dernier élément, et après chaque élément, il ajoute une virgule. Juste une façon alternative de ne pas avoir à utiliser de script du tout si le cas s'applique.


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

0

Une solution fonctionnelle ressemblerait à ceci:

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

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

0

Suivez celui-ci

$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

Si vous faites des réponses citées, vous pouvez faire

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

ce qui précède suppose que le fruit est non nul. Si vous ne voulez pas faire cette hypothèse, vous pouvez utiliser une instruction if-then-else ou un opérateur ternaire (? :).


-2

Une autre façon pourrait être comme ceci:

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

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

La sortie de $resultest une liste bien formatée, séparée par des virgules.

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.