Como faço para criar uma lista separada por vírgulas de uma matriz em PHP?


113

Eu sei como percorrer os itens de uma matriz usando foreach e acrescentar uma vírgula, mas é sempre uma dor ter que tirar a vírgula final. Existe uma maneira fácil de fazer isso em PHP?

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

No final das contas eu quero

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

Respostas:


231

Você quer usar implode para isso.

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


Existe uma maneira de adicionar vírgulas sem deixar uma no final. Você vai querer fazer isso se tiver que fazer alguma outra manipulação ao mesmo tempo. Por exemplo, talvez você queira citar cada fruta e, em seguida, separar todas por vírgulas:

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

Além disso, se você fizer isso da maneira "normal" de adicionar uma vírgula após cada item (como parece que você estava fazendo antes) e precisar cortar o último, basta fazer $list = rtrim($list, ', '). Vejo muitas pessoas bagunçando desnecessariamente substrnessa situação.


4
Faria mais sentido (se tentar adicionar aspas) chamar <code> $ fruitlist = '"'. Implode ('", "', $ fruit). '"'; </code>
cwallenpoole

O loop foreach é melhor se você deseja manipular os dados no array antes de transformá-los em uma string; Por exemplo, addlashes ou mysql_real_escape_string.
Naphtali Gilead de

39

É assim que tenho feito:

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

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

echo $string;

Resultado:

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

Demonstração ao vivo: http://ideone.com/EWK1XR

EDITAR: Por comentário de @joseantgv, você deve ser capaz de remover rtrim()do exemplo acima. Ie:

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

5
Como respondido acima, você poderia simplesmente implodir (',', $ arr)
joseantgv

@joseantgv Você está certo, não sei por que uso rtrim(). Lembro-me de ter tido um problema com a existência de vírgulas extras no final da string, mas não consigo me lembrar da situação em que isso estava acontecendo.
Nate

6

Resultado com andno 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

Semelhante à resposta de Lloyd, mas funciona com qualquer tamanho de matriz.

$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

Eu prefiro usar uma instrução IF no loop FOR que verifica se a iteração atual não é o último valor na matriz. Se não, adicione uma vírgula

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

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

2
se a contagem total for apenas diferente de 4?
Jyothish

1

Às vezes você nem precisa do php para isso em certas instâncias (os itens da lista estão cada um em sua própria tag genérica na renderização, por exemplo) Você sempre pode adicionar vírgulas a todos os elementos, exceto o último filho via css se eles forem elementos separados após serem renderizados do script.

Eu uso muito isso em aplicativos de backbone, na verdade, para cortar alguma gordura arbitrária de código:

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

Basicamente, olha para o elemento, segmenta todos, exceto o último elemento e, após cada item, adiciona uma vírgula. Apenas uma maneira alternativa de não precisar usar o script, se for o caso.


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

0

Uma solução funcional seria assim:

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

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

0

Siga este

$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 estiver respondendo entre aspas, você pode

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

o anterior assume que a fruta não é nula. Se você não quiser fazer essa suposição, pode usar uma instrução if-then-else ou o operador ternário (? :).


-2

Outra forma poderia ser assim:

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

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

A saída de $resulté uma lista separada por vírgulas bem formatada.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.