¿Cómo creo una lista separada por comas a partir de una matriz en PHP?


113

Sé cómo recorrer los elementos de una matriz usando foreach y agregar una coma, pero siempre es un dolor tener que quitar la coma final. ¿Existe una forma sencilla de PHP para hacerlo?

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

Al final quiero

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

Respuestas:


231

Quieres usar implosión para esto.

es decir: $commaList = implode(', ', $fruit);


Hay una forma de agregar comas sin tener una al final. Querrá hacer esto si tiene que hacer alguna otra manipulación al mismo tiempo. Por ejemplo, tal vez desee citar cada fruta y luego separarlas todas con comas:

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

Además, si lo hace de la manera "normal" de agregar una coma después de cada elemento (como suena que estaba haciendo antes), y necesita recortar el último, simplemente hágalo $list = rtrim($list, ', '). Veo a mucha gente jugando innecesariamente substren esta situación.


4
Tendría más sentido (si intenta agregar comillas) llamar a <code> $ fruitlist = '"'. Implode ('", "', $ fruit). '"'; </code>
cwallenpoole

El bucle foreach es mejor si desea manipular esos datos en la matriz antes de convertirlos en una cadena; Por ejemplo, addedlashes o mysql_real_escape_string.
Nephtali Gilead

39

Así es como lo he estado haciendo:

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

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

echo $string;

Salida:

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

Demostración en vivo: http://ideone.com/EWK1XR

EDITAR: según el comentario de @ joseantgv, debería poder eliminar rtrim()del ejemplo anterior. Es decir:

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

5
Como se respondió anteriormente, podría simplemente hacer implosión (',', $ arr)
joseantgv

@joseantgv Tienes razón, no sé por qué lo uso rtrim(). Recuerdo haber tenido un problema con las comas adicionales al final de la cadena, pero no recuerdo la situación en la que estaba sucediendo.
Nate

6

Resultado con andal 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

Similar a la respuesta de Lloyd, pero funciona con cualquier tamaño 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

Prefiero usar una declaración IF en el ciclo FOR que verifica que la iteración actual no sea el último valor de la matriz. Si no es así, agregue una coma

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

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

2
si el recuento total es diferente de 4?
Jyothish

1

A veces, ni siquiera necesita php para esto en ciertos casos (los elementos de la lista están en su propia etiqueta genérica en el renderizado, por ejemplo). Siempre puede agregar comas a todos los elementos excepto al último hijo a través de css si son elementos separados después de ser renderizados del guión.

Lo uso mucho en aplicaciones de backbone, en realidad, para recortar algo de código arbitrario:

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

Básicamente, mira el elemento, apunta a todos excepto a su último elemento, y después de cada elemento agrega una coma. Solo una forma alternativa de no tener que usar script en absoluto si el caso aplica.


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

0

Una solución funcional sería así:

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

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

0

Sigue 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

Si está haciendo respuestas citadas, puede hacer

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

lo anterior asume que la fruta no es nula. Si no desea hacer esa suposición, puede usar una instrucción if-then-else o un operador ternario (? :).


-2

Otra forma podría ser así:

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

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

La salida de $resultes una lista separada por comas bien formateada.

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.