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"
st4ck0v3rfl0w
fonte

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.

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

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

Vogomatix
fonte
-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
Jago
fonte
-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

Sanjay Arora
fonte