¿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"
st4ck0v3rfl0w
fuente

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.

centeno
fuente
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);
Nate
fuente
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
Waqar Alamgir
fuente
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."
        }
dejar de soñar
fuente
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 ", ";
    }
}
Lloyd Banks
fuente
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.

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

vogomatix
fuente
-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
Jago
fuente
-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

Sanjay Arora
fuente