2009-12-03 16 views
6

Esta es probablemente una pregunta simple, pero ¿cómo iterar a través de una matriz, haciendo algo para cada una, hasta la última y hacer algo diferente?Cómo usar un bucle foreach, pero hacer algo diferente en la última iteración?

Tengo una serie de nombres. Quiero mostrar la lista de nombres separados por comas.

José, Roberto Foobar

no quiero una coma al final del último nombre en la matriz, ni si sólo hay un valor de la matriz (o ninguno!) .

Actualización: No puedo usar implode() porque tengo una matriz de objetos del modelo de usuario donde obtengo el nombre de cada objeto.

$users = array(); 
$users[] = new User(); 

foreach ($users as $user) { 
    echo $user->name; 
    echo ', '; 
} 

¿Cómo puedo lograr esto y seguir usando estos objetos?

Actualización: Me estaba preocupando demasiado sobre cuántas líneas de código estaba poniendo en mi script de vista, así que decidí crear una vista auxiliar en su lugar. Esto es lo que terminé con:

$array = array(); 
foreach($users as $user) { 
    $array[] = $user->name; 
} 
$names = implode(', ', $array); 
+0

@ Andrew, he actualizado mi pregunta con una respuesta a su actualización. –

Respuesta

15

Uso implode:

$names = array('Joe', 'Bob', 'Foobar'); 
echo implode(', ', $names); # prints: Joe, Bob, Foobar 

para aclarar, si sólo hay un objeto de la matriz, el ', ' separador no se utilizará en absoluto, y se devolverá una cadena que contiene el único elemento.

EDIT: Si usted tiene una gran variedad de objetos, y que quería hacerlo de una manera que no sea un bucle for con las pruebas, usted puede hacer esto:

function get_name($u){ return $u->name; }; 
echo implode(', ', array_map('get_name', $users)); # prints: Joe, Bob, Foobar 
+0

gracias por su respuesta, lamentablemente no puedo usar implode() porque la matriz contiene objetos. ¿Hay alguna manera diferente de lograr lo mismo? – Andrew

+2

En PHP 5.3+ ni siquiera tiene que declarar una función, solo hágalo de forma anónima: implode (',', array_map (function ($ user) {return $ user-> name;}, $ users) –

+0

¿Es mal que he estado escribiendo php durante años y nunca pensé en esto? –

6
$array = array('joe', 'bob', 'Foobar'); 
$comma_separated = join(",", $array); 

de salida:

joe,bob,Foobar

+0

aparentemente join es un alias para implode :) –

+0

En realidad, prefiero el uso de join porque no confunde a los que provienen de un fondo java/perl. – karim79

+0

¡Lo sé! Tristemente, 'split' no es un alias para' explotar'. Entonces en PHP solo uso 'explde' y' implode' como cojo, como los nombres :) –

1

psuedocode ....

integer sigh=container.getsize(); 
sigh--; 
integer gosh=0; 
foreach element in container 
{ 
    if(gosh!=sigh) 
    dosomething(); 
    else 
    doLastElementStuff(); 
    gosh++; 
} 

mirando todas las demás respuestas, parece que PHP se ha vuelto mucho más sintáctico S desde la última vez que escribí algo en él: D

+0

Te doy un +1 para leer el título, pero tendría que dar un -1 por no leer la pregunta :) –

+0

Las preguntas fueron editadas mientras escribía la respuesta:/ –

+0

Ah, tiene sentido. Debo haberlo encontrado justo después de la edición. –

3

A veces es posible que no desee utilizar la implosión. El truco es usar una variable auxiliar para controlar no la última, sino la primera vez a través del ciclo. vis:

$names = array('Joe', 'Bob', 'Foobar'); 
$first = true; 
$result = ''; 
foreach ($names as $name) 
{ 
    if (!$first) 
     $result .= ', '; 
    else 
     $first = false; 

    $result .= $name; 
} 
+0

Eso está jugando con mi cabeza. –

0

Yo he encontrado la manera más rápida (si usted está en la optimización de micro) es:

if(isset($names[1])) { 
    foreach ($names as $name) { 
     $result .= $name . ', '; 
    } 
    $result = substr($result, 0, -2); 
    } else { 
    $result = $names[0]; 
    } 

isset($names[1]) es la manera más rápida (aunque no tan clara) de comprobar la longitud de una matriz (o cadena). En este caso, se realiza la comprobación de al menos dos elementos.

+0

Necesita '-2' en lugar de' -1' para eliminar el espacio __y__ la coma. –

+0

lo siento, fijo, cansado:] – raveren

1

llego al otro lado de esto unas instrucciones SQL Urbanizable etc.

$joiner = " "; 
foreach ($things as $thing) { 
    echo " $joiner $thing \n"; 
    $joiner = ','; 
} 

por alguna razón es más fácil de averiguar la lógica si se piensa en el "", 'Y' o 'O' como una opción/atributo que va antes de un artículo. El problema entonces es cómo suprimir el "," en la primera línea.

+0

Muy bueno, siempre y cuando el espacio en blanco no sea un problema. Pero el concepto es fuerte, y podrías escribirlo de manera diferente para eliminar el espacio en blanco adicional. +1 –

0

De hecho, me resulta más fácil crear mi texto delimitado por comas de forma un poco diferente. Es un poco más prolijo, pero son menos llamadas de función.

<?php 
$nameText = ""; 
for ($i = 0; $i < count($nameArray); $i++) { 
if ($i == 0) { 
$nameText = $nameArray[$i]; 
} 
else { 
$nameText .= "," . $nameArray[$i]; 
} 
} 

Agrega la coma como prefijo a todos los nombres, excepto donde es el primer elemento de la matriz. Me he encariñado con el uso de para en comparación con foreach ya que tengo fácil acceso al índice actual y, por lo tanto, a los elementos adyacentes de una matriz. Se podría utilizar foreach así:

<?php 
$nameText = ""; 
$nameCounter = 0; 
for ($nameArray as $thisName) { 
if ($nameCounter == 0) { 
$nameText = $thisName; 
$nameCounter++; 
} 
else { 
$nameText .= "," . $thisName; 
} 
} 
+0

Pero 'count' se evalúa de nuevo en cada ciclo, por lo que todavía tiene una llamada de función por ciclo. Además, está introduciendo una instrucción 'if' en cada ciclo también. –

Cuestiones relacionadas