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"
st4ck0v3rfl0w
la source

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.

Ryeguy
la source
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);
Nate
la source
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
Waqar Alamgir
la source
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."
        }
ceasetodream
la source
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 ", ";
    }
}
Lloyd Banks
la source
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.

Condensateur Lux.
la source
1
$fruit = array('apple', 'banana', 'pear', 'grape');    
$commasaprated = implode(',' , $fruit);
Vijay Prajapati
la source
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);
    },
    ''
);
Danielside
la source
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;
Islam Ariful
la source
-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 (? :).

vogomatix
la source
-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
Jago
la source
-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

Sanjay Arora
la source